elasticsearch优化之多字段搜索multi_match查询

1 首先说下multi_match多字段匹配的三种类型,分别是best_fields(最佳字段) 、 most_fields(多数字段) 和 cross_fields(跨字段)
2 best_fields类型,multi_match默认的查询类型,可以省略不写,返回某一个字段匹配到最多关键字的文档,比如我搜索”李安生日“,下面有两个文档

GET /news/_search
{
  "query": {
      "multi_match": {        
            "query": "李安生日",
            "fields": ["headline", "summary"],
            "type":    "best_fields",
        }
    }

doc1:
“headline”: “李安携新电影要与观众见面了”
“summary”: “特意安排在生日这天上映新电影”
doc2:
“headline” : “向李安同志学习”
“summary” : "李安同志的英雄事迹得到了弘扬”
应该返回doc1才是我们想要的结果,然而并不是,这个时候就需要兼顾到summary字段的匹配得分了,通过公式先看下:score=best_field.scoreboost+other_fieldsboost.score*tie_breaker,这样就得到了一个均衡的得分了。

GET /news/_search
{
  "query": {
      "multi_match": {
            "query": "李安生日",
            "fields": ["headline", "summary"],
            "type": "best_fields",
            "tie_breaker": 0.3
        }
    }
}

tie_breaker是将其它匹配的查询子句考虑进来也是可能的。通过指定tie_breaker参数将其它每个匹配的子句的分值乘以tie_breaker,以达到取得最佳匹配查询子句的_score
3 most_fields多数字段匹配成功的得分之和,字段匹配越多,得分越高,例如搜索“李安”,很显然文档doc2的匹配度高于文档doc1

GET /news/_search
{
  "query": {
      "multi_match": {
            "query": "李安",
            "fields": ["headline", "summary"],
             "type": "most_fields"
             
        }
    }
}

4 cross_fields指的是一个唯一标识,跨域了多个字段,比如人的标识是名字,一个建筑的标识是地址,姓名跨域散落在多个field中,比如first_name和last_name,一个地址也可以散落在多个字段中,比如country,province,city中。

GET /area/_search
{
    "query": {
        "multi_match": {
            "query": "河南省郑州市",
            "fields": ["province", "city"],
            "type": "cross_fields",
            "operator": "and"
        }
    }
}

operator使用and,是要返回两者同时匹配成功的结果。
————————————————
版权声明:本文为CSDN博主「codeSeeking」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/danger0629/article/details/102695894

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章