ES multi_match 你真的懂了嗎

ES的核心就是全文檢索,在實際業(yè)務中全文檢索用到最多的查詢方式就是multi_match語法,該語法參數(shù)比較多,用的不好不但效果出不來而且還會影響性能,故這里對 multi_match 使用做下參數(shù)詳解

基本語法

multi_match 顧名思義就是提供在多個字段上查詢的意思,基本語法:

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "this is a test", 
      "fields": [ "title^2", "*_name" ] 
    }
  }
}
  • query
    來自用戶輸入的查詢短語
  • fields
    數(shù)組,默認支持最大長度1024,可以單獨為任意字段設置相關度權重,支持通配符;fields可以為空,為空時會取mapping階段配置的所有支持term查詢的filed組合在一起進行查詢

其它參數(shù)

  • type
    定義內部查詢方式和打分方式
說明
best_fields 按照match檢索,所有字段單獨計算得分并取最高分的field為最終_score,雖然是默認值,但不建議使用,數(shù)據(jù)量上來后查詢性能會下降
most_fields 按照match檢索,融合所有field得分為最終_score
cross_fields 將fields中的所有字段融合成一個大字段進行match檢索,此時要求所有字段使用相同分析器
phrase 按照match_phrase檢索,默認slop為0,執(zhí)行短語精確匹配,所以即便設置 minimum_should_match 也無效; 取最高字段得分
phrase_prefix 按照match_phrase_prefix檢索,滑動步長slop默認為0;取最高字段得分
bool_prefix 按照match_bool_prefix檢索

需要注意的是當best_fields、most_fields與operator 或 minimum_should_match 參數(shù)連用時會要求用戶輸入詞必須在任意單一字段上完全滿足的文檔才會出現(xiàn),如

GET /_search
{
  "_source": ["title","desc"], 
  "query": {
     "multi_match": {
       "query": "高端婚禮邀請函",
       "fields": ["title","desc"],
       "operator": "and"
     }
  }
}

其匹配邏輯為:
(title:高端 + title:婚禮 + title:邀請函) || (desc:高端 + desc:婚禮 + desc:邀請函)
可調整為如下方式,提升命中效果:

{
  "_source": ["title","desc"], 
  "query": {
     "multi_match": {
       "query": "高端婚禮邀請函",
       "fields": ["title","desc"],
       "operator": "and",
       "type": "cross_fields"
     }
  }
}
# 這種方式會將所有字段組合在一起作為一個大字段來用,在精確匹配時效果提升明顯,命中商品數(shù)量比之前多
  • tie_breaker
    取值范圍0-1,當type使用默認值 best_fields ,tie_breaker將會改變默認_score計算方式,采用best_field_score + tie_breaker*other_field_score

  • analyzer
    用戶搜索輸入詞采用哪種解析器進行分詞,默認使用mapping階段指定的分詞器;如果analyzer設置和索引階段的分詞器不一致時,且operator為and 那么在執(zhí)行查詢時可能理應完全匹配的短語結果檢索為空的情況。

  • fuzziness
    指定模糊程度,支持數(shù)字或auto

  • prefix_length
    當使用模糊查詢時,用來指定前綴不變長度

  • lenient
    當查詢報錯時是否忽略該文檔,默認為false

  • operator
    匹配關系的邏輯判斷,默認為or,當為and時表示所有輸入詞必須完全匹配

  • minimum_should_match
    該參數(shù)生效的前提是operator為or,支持數(shù)字、百分比或者混合配置,如:

# 當詞長度>3時可以有一個模糊,>6時允許兩個,超過10個則模糊一半
"minimum_should_match": "3<-1 6<-2 10<50%" 
  • zero_terms_query
    當用戶輸入詞全部為停用詞時是否返回文檔,默認為none即不返回數(shù)據(jù),設置為all時,查詢將被改寫為match_all

  • auto_generate_synonyms_phrase_query
    是否開啟同義詞查詢,默認為true

#如在analysis/synonym.txt中設置可愛同義詞為粉色、卡通,可愛風格將會被改寫為
(可愛 OR (粉色 AND 卡通))風格

關于同義詞的詳細用法請參看我的另一篇文章ES同義詞配置

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容