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_scoreanalyzer
用戶搜索輸入詞采用哪種解析器進行分詞,默認使用mapping階段指定的分詞器;如果analyzer設置和索引階段的分詞器不一致時,且operator為and 那么在執(zhí)行查詢時可能理應完全匹配的短語結果檢索為空的情況。fuzziness
指定模糊程度,支持數(shù)字或autoprefix_length
當使用模糊查詢時,用來指定前綴不變長度lenient
當查詢報錯時是否忽略該文檔,默認為falseoperator
匹配關系的邏輯判斷,默認為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_allauto_generate_synonyms_phrase_query
是否開啟同義詞查詢,默認為true
#如在analysis/synonym.txt中設置可愛同義詞為粉色、卡通,可愛風格將會被改寫為
(可愛 OR (粉色 AND 卡通))風格
關于同義詞的詳細用法請參看我的另一篇文章ES同義詞配置