1. 程式人生 > >ElasticStack學習(十):深入ElasticSearch搜尋之QueryFiltering、多/單字串的多欄位查詢

ElasticStack學習(十):深入ElasticSearch搜尋之QueryFiltering、多/單字串的多欄位查詢

一、複合查詢

  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核心技術與實戰》&n