Elasticsearch 不同的搜索类型之间的区别

1、match   轻量级搜索

1 GET /wymlib/_search
2 
3 {
4   "query": {
5     "match": {
6        "title": "王阳明"
7     }
8   }
9 }

上面的查询匹配就会进行分词,比如"王阳明"会被ik分词器分为"王阳明" ,"阳明", "王","阳","明" 那么所有包含这些词中的一个或多个的文档就会被搜索出来。并且根据lucene的评分机制(TF/IDF)来进行评分。

2、match_phrase   短语搜索

1 GET   /wymlib/_search
2 
3 {
4   "query": {
5     "match_phrase": {
6       "title": "王阳明"
7     }
8   }
9 }

match_phrase要求只匹配上"王阳明"这个短语,完全匹配可能比较严,我们会希望有个可调节因子,少匹配一个也满足,那就需要使用到slop

 1 {
 2   "query": {
 3     "match_phrase": {
 4         "title" : {
 5             "query" : "王阳明",
 6             "slop" : 1
 7         }
 8     }
 9   }
10 }

3、multi_match   多字段匹配

如果我们希望两个或两个以上的字段进行匹配,其中一个字段能匹配上就满足的话,使用multi_match

 1 {
 2   "query": {
 3     "multi_match": {
 4       "query": "王阳明第三卷",
 5       "fields": [
 6         "title",
 7         "keywords",
 8         "author"
 9       ]
10     }
11   }
12 }

multi_match中有三种类型即: best_fields 、 most_fields 和 cross_fields (最佳字段、多数字段、跨字段)

1) 我们希望完全匹配的文档占的评分比较高,则需要使用best_fields,multi_match默认是best_fields

 1 {
 2   "query": {
 3     "multi_match": {
 4       "query": "王阳明",
 5       "fields": [
 6         "title",
 7         "yearAlias"
 8       ],
 9       "minimum_should_match": "70%"
10     }
11   }
12 }

2) 我们希望越多字段匹配的文档评分越高,就要使用most_fields

{
  "query": {
    "multi_match": {
      "query": "王阳明",
      "type": "most_fields",
      "fields": [
        "title",
        "keywords"
      ]
    }
  }
}

3) 我们会希望这个词条的分词词汇是分配到不同字段中的,那么就使用cross_fields

 1 {
 2   "query": {
 3     "multi_match": {
 4       "query": "王阳明",
 5       "fields": [
 6         "title",
 7         "keywords"
 8       ],
 9       "type": "cross_fields"
10     }
11   },
12   "highlight": {
13     "fields": {
14       "title": {
15         "pre_tags": ["<a>" ],
16         "post_tags": [ "</a>"]
17       },
18       "keywords": {
19         "pre_tags": ["<b>" ],
20         "post_tags": ["</b>" ]
21       }
22     }
23   }
24 }

上面查询语句中,包含了高亮显示结果属性:highligt

4、term 精确值查找

1 {
2   "query": {
3     "term": {
4       "title": "王阳明"
5     }
6   }
7 }

与match查询类似,但term是精确查找,代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇,但是 term 和 terms 是 必须包含(must contain) 操作,而不是必须精确相等(must equal exactly),当查询 jack 时,[jack] 和[jack,jone]两条数据都会被找到

原文地址:https://www.cnblogs.com/hoojjack/p/8600230.html