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

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