吃透 | Elasticsearch filter和query的不同
少囉嗦,直接看東西。——羅永浩
1、query和filter的本質區別?
以下幾張圖能更好的概括:
query關注點:此文件與此查詢子句的匹配程度如何?
filter關注點:此文件和查詢子句匹配嗎?
2、Query檢索細化關注點
1)是否包含?
確定文件是否應該成為結果的一部分.
2)相關度得分多少?
除了確定文件是否匹配外,查詢子句還計算了表示文件與其他文件相比匹配程度的_score。
3)得分越高,相關度越高。
更相關的檔案,在搜尋排名更高。
典型應用場景:
1)全文檢索——這種相關性的概念非常適合全文搜尋,因為很少有完全“正確”的答案。
舉例如下:
文件中存在欄位hotel_name:“上海浦東香格里拉酒店”
IK實際分詞結果如下:
上海浦東,上海,浦東,香格里拉,格里,里拉,酒店。
也就是說,搜尋以上關鍵詞都能搜到:hotel_name:“上海浦東香格里拉酒店”的酒店。這些都是“相關”的。
但是搜尋:“香格里” 是搜尋不到結果的。
2)包含單詞“run”, 但也匹配”runs”, “running”, “jog”或者”sprint”。(都是奔跑的意思)
3、filter過濾細化關注點
1)是否包含?
確定是否包含在檢索結果中,回答只有“是”或“否”。
2)不涉及評分。
在搜尋中沒有額外的相關度排名。
3)針對結構化資料。
適用於完全精確匹配,範圍檢索。
參見官網舉例:
以下場景適用於filter過濾檢索:
舉例1:時間戳timestamp 是否在2015至2016年範圍內?
舉例2:狀態欄位status 是否設定為“published”?
4)更快。
只確定是否包括結果中,不需要考慮得分。
為什麼會更快?——經常使用的過濾器將被Elasticsearch自動快取,以提高效能。
4、query和filter的效能不同
過濾查詢(filter)是對集合包含/排除的簡單檢查,這使得它們計算速度非常快。 當至少有一個過濾查詢是“稀疏”(僅有少量匹配的文件)時,可以利用各種優化,並且可以將快取經常使用的filter過濾查詢快取在記憶體中以加快訪問速度。
對比之下,query檢索(評分查詢)不僅要查詢匹配的文件,還要計算每個文件的相關程度,這通常會使其比非評分文件更復雜。 另外,查詢結果不可快取。
由於倒排索引,只有幾個文件匹配的簡單評分查詢(query檢索)可能會比跨越數百萬個文件的過濾器(filter過濾)表現得更好。 但是,一般來說,fiter過濾的效能將勝過評分查詢(query檢索)。
過濾(filter)的目標是減少必須由評分查詢(query)檢查的文件數量。
5、filter過濾怎麼快取呢?
Elasticsearch將建立一個文件匹配過濾器的位集bitset(如果文件匹配則為1,否則為0)。 隨後用相同的過濾器執行查詢將重用此資訊。
每當新增或更新新文件時,位集bitset也會更新。
6、使用場景
全文檢索以及任何使用相關性評分的場景使用query檢索。
除此之外的其他使用filter過濾器過濾。
7、query和filter實戰
ebay在Elasticsearch使用經驗中總結到:
Use filter context instead of query context if possible.
即:如果可能,請使用filter過濾器上下文而不是query查詢上下文。
查詢query和過濾器filter已合併(在ES1.X版本是分開的,存在filtered檢索型別)。
ES高版本(2.X/5.X/6.x以後),任何查詢子句都可以在“查詢上下文query”中用作查詢,並在“過濾器上下文filter”中用作過濾器。
舉例:
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
8、小結
官網&原始碼才是王道。
多看、多思、多總結。弄清原理,高效開發才有了保障!
參考:
1、官網:
2、實戰:
3、Google工程師視訊
加入知識星球,更短時間更快習得更多幹貨!
2018年05月27日 13:27 於家中床前