一、複合查詢 1、在ElasticSearch中,有Query和Filter兩種不同的Context。Query Context進行了相關性算分,Filter Context不需要進行算分,同時可以利用Cache,獲取更好的性能。 2、bool Query:一個布爾查詢,是一個或者多個查詢子句的組合 ...
一、複合查詢
1、在ElasticSearch中,有Query和Filter兩種不同的Context。Query Context進行了相關性算分,Filter Context不需要進行算分,同時可以利用Cache,獲取更好的性能。
2、bool Query:一個布爾查詢,是一個或者多個查詢子句的組合,總共有四種類型的子句,其中2種影響算分,2種不影響算分。
布爾查詢也涉及相關性算分,因為匹配的子句越多,相關性算分越高。對於布爾查詢中的每個查詢子句計算得出的算分會被合併到總的相關性算分中。
子查詢可以任意順序出現,同時可以嵌套多個子查詢。
布爾查詢的算分過程:
1)查詢Should語句中的查詢;
2)對查詢結果的評分進行求和;
3)乘以匹配語句的總數;
4)除以所有語句的總數;
3、複合查詢應用
1)must_not與filter
2)should
3)bool嵌套
4)對於should下同一層級的競爭欄位,具有相同的權重,若通過嵌套bool查詢,可以改變對算分的影響。
5)控制欄位boost權重,來影響查詢返回的結果。
6)要求滿足相關度高的文檔在前或者排除不相關條件的文檔,Boosting Query提升了Precision,同時也提升了Recall。
二、單字元串多欄位查詢
1)背景示例展示:
從示例中可以看出,對title和body兩個欄位進行“brown fox”的匹配,由於第二條只有在body中有brown fox,而第一條在title,body中均有匹配。所以,第一條的綜合算分比第二條的算分要高。
2)Disjunction Max Query
對於上例中title與body相互競爭,在查詢brown fox時,更應該將第二條信息搜索出來。因此,對於搜索策略不應該將分數簡單相加,而是應該找到最佳匹配的欄位評分。
Disjunction Max Query可以按最匹配欄位評分進行返回。
從上圖可以看出,通過Disjunction Max Query進行查詢,獲取了最合適的匹配結果。
3)Tie Breaker
通過對quice pets進行查詢,會發現兩條文檔的評分是一樣的,這是因為quick pets做為查詢Term存在,在title或body中存在,兩者的評分是一樣的。為了獲取最佳匹配,可以使用Tie Breaker。如下圖所示:
可以看出,文檔2排在了文檔1的前面,原因是文檔2的title和body,分別存有quick或pets,而文檔1中只有title存在有一個quick。因此文檔2的評分比文檔1的高。
Tie Breaker的作用:Tie Breaker是一個介於0-1之間的浮點數,1代表使用最佳匹配;0代表所有語句同等重要。
獲得最佳匹配語句的評分;
將其他匹配語句的評分與Tie Breaker相乘;
對以上評分求和並規範化;
4)Multi Match
當輸入單個字元串進行查詢時,通常會遇到三種情形:
a)最佳欄位
當欄位之間相互競爭,又相互關聯時,評分來自於最匹配欄位,比如上述的title和body欄位。如當搜索“brown fox”時,此時該片語比兩個獨立的單詞更有意義,因此文檔在相同欄位中包含的詞最多越好,評分也來自於最匹配欄位。
b)多數欄位
為了對相關度進行微調,常用的技術就是將相同的數據索引到不同的欄位,以匹配更多的文檔。具體操作就是:
在主欄位抽取詞乾,加入同義詞、變音詞、口語詞,以匹配更多的欄位;
相同的文本,加入子欄位,以提供更加精確的匹配;
其他欄位作為匹配文檔提高相關度的信號,匹配欄位最多越好;
通過上圖可以發現,文檔2更符合quicking brown的搜索條件,但是它排在了第2位,原因就是兩個欄位採用了英文分詞器,而查詢的實際上是quick、brown兩個Term,在兩個文檔中的title或body欄位中,存在於這兩個詞。又因為第一個文檔的相應欄位總詞數比第二個文檔的相應欄位總詞數少,所以文檔1評分會較高。
對上圖分析發現,用廣度匹配欄位body,以包括儘可能多的文檔,提升了召回率,同時對body欄位增加了子欄位,將std作為信號將相關度更高的文檔置於結果頂部。
每個欄位對於最終評分的貢獻可以通過自定義值boost來控制。如下圖所示:
未設置boost值的情況
將body設置boost的情況
c)混合欄位
對於某些實體,例如人名、地址、圖書信息。需要在多個欄位中確定信息,單個欄位只能作為整體的一部分。希望在列出的欄位中找到儘可能多的詞。
比如對於街道+門牌號存在於指定搜索欄位的文檔記錄,如果想用most_fileds進行搜索是無法直接進行搜索的,對於operator=and也不能使用,因為它不適用於跨欄位場景中。
而之前用於欄位中的copy_to,雖然可以解決此類問題,但是需要額外的存儲空間,因此也不是最優的解決方式。
從上圖中可以看出,cross_fields可以配合operator=and進行跨欄位的查詢匹配,同時與copy_to相比,它還可以在搜索時為單個欄位提升權重,如下圖所示:
大家可關註我的公眾號
知識學習來源:阮一鳴:《Elasticsearch核心技術與實戰》