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