一、match
match query 查询会对查询语句进行分词(可以指定分词器,若没有指定分词器采用默认的标准分词器),分词后查询语句中的任何一个词项被匹配,文档就会被搜索到。如果想查询匹配所有关键词的文档,可以采用“and”操作符。
post localhost:9200/books/it/_search
{
"query": {
"match": {
"title": {
"query": "java编程思想",
"operator": "or"
}
}
}
}
二、match_phrase
match_phrase query 查询在 match 查询基础上还需满足以下两个条件才可以被搜索到;
1、分词后所有词项都要出现在该字段中;
2、字段中的词项顺序要一致。
post localhost:9200/books/it/_search
{
"query": {
"match_phrase": {
"description": {
"query": "程序",
"analyzer": "ik_max_word"
}
}
}
}
三、match_phrase_prefix
match_phrase_prefix query 查询 和 match_phrase query 查询类似,只不过 match_phrase_prefix 支持最后一个 term 前缀匹配。
post localhost:9200/books/it/_search
{
"query": {
"match_phrase_prefix": {
"description": {
"query": "j",
"analyzer": "ik_max_word"
}
}
}
}
四、multi_match
multi_match query 是 match的升级,用于在多个字段中搜索。
在字段 title 和 description中查找包含“性能”的文档(相当于在title和description组成的一个新的字段中查询)
post localhost:9200/books/it/_search
{
"query": {
"multi_match": {
"query": "性能",
"fields": ["title", "description"]
}
}
}
(1) multi_match 支持使用通配符来定义要搜索的字段。
{
"query": {
"multi_match": {
"query": "性能",
"fields": ["title", "*_name"]
}
}
}
(2) multi_match 可以通过指数符来指定搜索字段的权重。
比如:指定关键词出现在title中的权重是出现在description字段中的3倍。
{
"query": {
"multi_match": {
"query": "性能",
"fields": ["title^3", "description"]
}
}
}
五、common_terms
common_terms query 是一种在不牺牲性能的情况下替代停用词提高搜索准确率和召回率的方案。
query 查询的时候会把查询词进行分词,然后每个词项都会到索引中执行一次,然后再合并返回。但是如果查询词中有高频词(比如:的等),这些高频词往往不重要,但是搜索又会花费大量时间,降低了性能。传统解决方案是把这些高频词当作停用词处理,去除停用词可以大大减少索引大小,同时在搜索时减少对停用词的收缩。但是在有些查询词中停用词却非常重要,去掉停用词就不是完美的解决方案了。common_terms query 提供了一种解决方案,它把分词后的词项分为重要词项(低频词项)和不重要词项(高频词项),在搜索时,首先搜索和重要词项匹配的文档,然后执行第二次查询搜索对文档频分影响较小的高频词项,计算频分时只计算第一次查询已经匹配的文档得分。
词项是高频词还是低频词是通过 cutoff_frequency 来设置阀值的,取值可以是绝对频率(频率大于1)或者相对频率(0~1);
同时 common_term 查询能够自适应特定领域的停用词。比如视频网站,“video”会自动变现为高频词。
{
"query": {
"common": {
"description": {
"query": "程序的",
"cutoff_frequency": "0.01",
"high_freq_operator": "and",
"low_freq_operator": "and"
}
}
}
}
(1) 文档频率高于1%的词项将会被当作高频词;
(2) 高频词之间的操作符是and,表示必须满足匹配所有的高频词;
(3) 低频词之间采用and操作符,表示低频词都是必须搜索的。