閱讀558 返回首頁    go 技術社區[雲棲]


《深入理解Elasticsearch(原書第2版)》一2.4.1 過濾及查詢相關性

本節書摘來華章計算機《深入理解Elasticsearch(原書第2版)》一書中的第2章 ,第2.4.1節,[美]拉斐爾·酷奇(Rafal Ku) 馬雷克·羅戈任斯基(Marek Rogoziski)著 張世武 餘洪淼 商旦 譯 更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。

2.4.1 過濾及查詢相關性

普通查詢和過濾的第一個差異在於它們對文檔打分的影響。讓我們舉例對比一下查詢和過濾的輸出。首先執行如下查詢:
image
image

這個查詢的結果如下:
image

這個查詢沒有任何特異之處。Elasticsearch將返回所有在title字段中包含“front”的文檔。需要指出的是,每個和查詢匹配的文檔都會被計算得分,其中得分最高的一組文檔被作為查詢結果返回給用戶。在本例中,該查詢返回了一篇得分為0.11506981的文檔。以上這些就是查詢的一般行為。
接著我們來對比一下查詢和過濾。在一個同時包含查詢和過濾的例子中,我們將加入一段代碼片段,限製返回文檔隻能有一個副本(copies字段取值為1)。不使用過濾的查詢方式如下:
image
image

Elasticsearch返回的查詢結果和上一個查詢非常相似:
image

上麵這段查詢代碼中的bool查詢由兩個term查詢構成,每個結果文檔都需要同時匹配這兩個term查詢。這個查詢返回了和上一查詢相同的文檔,不過文檔得分變成了0.98976034。這和我們讀完2.1節後的期望一致:每個詞項都會影響得分。
接下來我們來看看使用過濾的查詢方式,在titile字段匹配“front”的查詢,同時針對copies字段進行過濾。
image

現在,我們構造好了一個term查詢,同時還添加了一個term過濾器。從下麵的返回代碼中可以看出,輸出的文檔和不使用過濾時一樣,不過文檔得分發生了變化。
image
image

這個文檔的得分為0.11506981,這和本節最開始的查詢結果一模一樣。通過得分對比我們得出結論:過濾不影響文檔得分。
 舊版Elasticsearch使用“filter”而不是上述代碼中的“post_filter”來標識查詢語句中的過濾片段。在1.x版本中,這兩種標記方式都可以正常使用,不過請注意,“filter”方式可能將在之後的版本中停用。
一般來說,查詢和過濾在工作過程中存在一個主要的差異。過濾的唯一目的是用特定篩選條件來縮小結果範圍。而查詢不僅縮小結果範圍,還會影響文檔的得分,這一點在強調文檔相關性時非常重要,不過需要付出一定的代價:需要額外的CPU消耗來計算文檔得分。當然,這不是查詢和過濾的唯一區別。本節剩餘部分將著重探討過濾器的工作原理和Elasticsearch提供的不同過濾方式之間的異同。

最後更新:2017-06-23 23:36:15

  上一篇:go  今年618,天貓拿出了哪些壓箱底的黑科技?
  下一篇:go  Java double取值範圍及Double的MAX_VALUE和MIN_VALUE