吃透 | Elasticsearch filter和query的不同
少啰嗦,直接看東西。——羅永浩
1、query和filter的本質(zhì)區(qū)別?
以下幾張圖能更好的概括:
query關(guān)注點:此文檔與此查詢子句的匹配程度如何?
filter關(guān)注點:此文檔和查詢子句匹配嗎?
2、Query檢索細(xì)化關(guān)注點
1)是否包含?
確定文檔是否應(yīng)該成為結(jié)果的一部分.
2)相關(guān)度得分多少?
除了確定文檔是否匹配外,查詢子句還計算了表示文檔與其他文檔相比匹配程度的_score。
3)得分越高,相關(guān)度越高。
更相關(guān)的文件,在搜索排名更高。
典型應(yīng)用場景:
1)全文檢索——這種相關(guān)性的概念非常適合全文搜索,因為很少有完全“正確”的答案。
舉例如下:
文檔中存在字段hotel_name:“上海浦東香格里拉酒店”
IK實際分詞結(jié)果如下:
上海浦東,上海,浦東,香格里拉,格里,里拉,酒店。
也就是說,搜索以上關(guān)鍵詞都能搜到:hotel_name:“上海浦東香格里拉酒店”的酒店。這些都是“相關(guān)”的。
但是搜索:“香格里” 是搜索不到結(jié)果的。
2)包含單詞“run”, 但也匹配”runs”, “running”, “jog”或者”sprint”。(都是奔跑的意思)
3、filter過濾細(xì)化關(guān)注點
1)是否包含?
確定是否包含在檢索結(jié)果中,回答只有“是”或“否”。
2)不涉及評分。
在搜索中沒有額外的相關(guān)度排名。
3)針對結(jié)構(gòu)化數(shù)據(jù)。
適用于完全精確匹配,范圍檢索。
參見官網(wǎng)舉例:
以下場景適用于filter過濾檢索:
舉例1:時間戳timestamp 是否在2015至2016年范圍內(nèi)?
舉例2:狀態(tài)字段status 是否設(shè)置為“published”?
4)更快。
只確定是否包括結(jié)果中,不需要考慮得分。
為什么會更快?——經(jīng)常使用的過濾器將被Elasticsearch自動緩存,以提高性能。
4、query和filter的性能不同
過濾查詢(filter)是對集合包含/排除的簡單檢查,這使得它們計算速度非常快。 當(dāng)至少有一個過濾查詢是“稀疏”(僅有少量匹配的文檔)時,可以利用各種優(yōu)化,并且可以將緩存經(jīng)常使用的filter過濾查詢緩存在內(nèi)存中以加快訪問速度。
對比之下,query檢索(評分查詢)不僅要查找匹配的文檔,還要計算每個文檔的相關(guān)程度,這通常會使其比非評分文檔更復(fù)雜。 另外,查詢結(jié)果不可緩存。
由于倒排索引,只有幾個文檔匹配的簡單評分查詢(query檢索)可能會比跨越數(shù)百萬個文檔的過濾器(filter過濾)表現(xiàn)得更好。 但是,一般來說,fiter過濾的性能將勝過評分查詢(query檢索)。
過濾(filter)的目標(biāo)是減少必須由評分查詢(query)檢查的文檔數(shù)量。
5、filter過濾怎么緩存呢?
Elasticsearch將創(chuàng)建一個文檔匹配過濾器的位集bitset(如果文檔匹配則為1,否則為0)。 隨后用相同的過濾器執(zhí)行查詢將重用此信息。
每當(dāng)添加或更新新文檔時,位集bitset也會更新。
6、使用場景
全文檢索以及任何使用相關(guān)性評分的場景使用query檢索。
除此之外的其他使用filter過濾器過濾。
7、query和filter實戰(zhàn)
ebay在Elasticsearch使用經(jīng)驗中總結(jié)到:
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" }}}
????? ]
??? }
? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
8、小結(jié)
官網(wǎng)&源碼才是王道。
多看、多思、多總結(jié)。弄清原理,高效開發(fā)才有了保障!
參考:
1、官網(wǎng):
http://t.cn/R14moYO
http://t.cn/R14kLl6
2、實戰(zhàn):
http://t.cn/R1bZwy8
http://t.cn/RQhzDiP
3、Google工程師視頻
加入知識星球,更短時間更快習(xí)得更多干貨!
————————————————
版權(quán)聲明:本文為CSDN博主「銘毅天下」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/laoyang360/article/details/80468757
總結(jié)
以上是生活随笔為你收集整理的吃透 | Elasticsearch filter和query的不同的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: think-in-java(21)并发
- 下一篇: elasticsearch7常见查询(t