天天看點

[ElasticSearch2.x]Queries vs Filters

1. 查詢與過濾

Elasticsearch 使用的查詢語言(DSL) 擁有一套查詢元件(queries),這些元件可以以無限組合的方式進行搭配(mixed and matched)。這套元件可以在以下兩種上下文中使用:過濾上下文(filtering context)和查詢上下文(query context)。

當在過濾上下文(filtering context)中使用 時,該查詢被設定成一個“不評分”或者“過濾”的查詢。換句話說,這個查詢隻是簡單的問一個問題:“這篇文檔是否比對?”。回答也是非常的簡單,是或者不是。

  • created 時間是否在 2013 與 2014 這個區間?
  • status 字段是否包含 published 這個詞項?
  • lat_lon 字段表示的位置是否在指定點的 10km 範圍内?

當在查詢上下文中使用時,查詢就變成了一個“評分”的查詢。和不評分的查詢類似,也要去判斷這個文檔是否比對,同時它還需要判斷這個文檔比對程度如何(相關度)。

此查詢的典型用法是用于查找以下文檔:

  • 查找與 

    full text search

     這個詞語最佳比對的文檔
  • 包含 run 這個詞,也能比對 runs,running,jog 或者 sprint
  • 包含 quick, brown 和 fox 這幾個詞,它們之間距離越近,文檔相關性越高
  • 标有lucene, search 或者 java 标簽, 含有标簽越多, 相關性越高

一個評分查詢計算每一個文檔與此查詢的 相關程度,同時将這個相關程度指派給一個相關性變量 

_score

,然後使用這個變量按照相關性對比對到的文檔進行排序。相關性的概念是非常适合全文搜尋的情況,因為全文搜尋幾乎沒有完全 “正确” 的答案。

注意

以前版本中,查詢(queries)和過濾器(filters)是Elasticsearch中兩個互相獨立的元件。 從Elasticsearch 2.0版本開始,過濾器就已經删除了,同時所有查詢(queries)都獲得了不評分查詢的能力。

然而,為了簡潔與清晰,我們将使用“過濾器”術語來表示在非評分過濾上下文中使用的查詢。 您可以将“過濾器”,“過濾查詢”和“非評分查詢”等術語視為相同的。

類似地,如果術語“查詢”在沒有限定符的情況下單獨使用,我們指的是“評分查詢”。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEB190268067784dbccec46368ad4818e9b%3Fmethod%3Ddownload%26read%3Dtrue#2-%E6%80%A7%E8%83%BD%E5%B7%AE%E5%BC%82 2. 性能差異

過濾查詢是簡單的包含/排除檢查,這使得它們計算速度非常快。 當至少有一個過濾查詢的結果是“稀疏”的(比對到少數文檔)時,有很多不同優化方法可以做,并且非評分查詢經常被使用來緩存在記憶體中,以便更快的通路(ere are various optimizations that can be leveraged when at least one of your filtering query is "sparse" (few matching documents), and frequently used non-scoring queries can be cached in memory for faster access.)。

相反,評分查詢不僅要找到比對的文檔,還要計算每個文檔的相關度,這通常使它們比非評分查詢更重,更緩慢。 此外,查詢結果不可緩存。

由于反向索引的存在,一個簡單的評分查詢(scoring query)在隻比對幾個文檔時可能會比過濾數百萬文檔的過濾器(filter)更好。 然而,一般來說,過濾器比評分查詢性能更優異,并且表現的很穩定。

過濾的目标是減少那些需要通過評分查詢(scoring queries)進行檢查的文檔。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEB190268067784dbccec46368ad4818e9b%3Fmethod%3Ddownload%26read%3Dtrue#3-%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E6%9F%A5%E8%AF%A2%E4%B8%8E%E8%BF%87%E6%BB%A4 3. 如何選擇查詢與過濾

通常的規則是,使用 查詢(query)語句來進行 

全文搜尋

 或者 有對于任何影響相關性得分的條件。除此以外的情況都使用過濾(filters)(As a general rule, use query clauses for full-text search or for any condition that should affect the relevance score, and use filters for everything else)。

原文連接配接:

https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html#_queries_and_filters