您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)ES中怎么利用filter提高查詢效率,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Elasticsearch(下面簡稱ES)中的bool查詢在業(yè)務(wù)中使用也是比較多的。在一些非實時的分頁查詢,導(dǎo)出的場景,我們經(jīng)常使用bool查詢組合各種查詢條件。
Bool查詢包括四種子句,
must
filter
should
must_not
我這里只介紹下must和filter兩種子句,因為是我們今天要講的重點。其它的可以自行查詢官方文檔。
must, 返回的文檔必須滿足must子句的條件,并且參與計算分值
filter, 返回的文檔必須滿足filter子句的條件。但是跟Must不一樣的是,不會計算分值, 并且可以使用緩存
從上面的描述來看,你應(yīng)該已經(jīng)知道,如果只看查詢的結(jié)果,must和filter是一樣的。區(qū)別是場景不一樣。如果結(jié)果需要算分就使用must,否則可以考慮使用filter。
光說比較抽象,看個例子,下面兩個語句,查詢的結(jié)果是一樣的。
使用filter過濾時間范圍,
GET kibana_sample_data_ecommerce/_search
{
"size": 1000,
"query": {
"bool": {
"must": [
{"term": {
"currency": "EUR"
}}
],
"filter": {
"range": {
"order_date": {
"gte": "2020-01-25T23:45:36.000+00:00",
"lte": "2020-02-01T23:45:36.000+00:00"
}
}
}
}
}
}
使用must過濾時間范圍,
GET kibana_sample_data_ecommerce/_search
{
"size": 1000,
"query": {
"bool": {
"must": [
{"term": {
"currency": "EUR"
}},
{"range": {
"order_date": {
"gte": "2020-01-25T23:45:36.000+00:00",
"lte": "2020-02-01T23:45:36.000+00:00"
}
}}
]
}
}
}
查詢的結(jié)果都是,
{
"took" : 25,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1087,
"relation" : "eq"
},
...
上一節(jié)你已經(jīng)知道了must和filter的基本用法和區(qū)別。簡單來講,如果你的業(yè)務(wù)場景不需要算分,使用filter可以真的讓你的查詢效率飛起來。
為了說明filter查詢高效的原因,我們需要引入ES的一個概念 query context
和 filter context
。
query context
query context
關(guān)注的是,文檔到底有多匹配查詢的條件,這個匹配的程度是由相關(guān)性分?jǐn)?shù)決定的,分?jǐn)?shù)越高自然就越匹配。所以這種查詢除了關(guān)注文檔是否滿足查詢條件,還需要額外的計算相關(guān)性分?jǐn)?shù).
filter context
filter context
關(guān)注的是,文檔是否匹配查詢條件,結(jié)果只有兩個,是和否。沒有其它額外的計算。它常用的一個場景就是過濾時間范圍。
并且filter context會自動被ES緩存結(jié)果,效率進一步提高。
對于bool查詢,must使用的就是query context
,而filter使用的就是filter context
。
我們可以通過一個示例驗證下。繼續(xù)使用第一節(jié)的例子,我們通過kibana自帶的search profiler
來看看ES的查詢的詳細過程。
使用must查詢的執(zhí)行過程是這樣的:
可以明顯看到,此次查詢計算了相關(guān)性分?jǐn)?shù),而且score的部分占據(jù)了查詢時間的10分之一左右。
filter的查詢我就不截圖了,區(qū)別就是score這部分是0,也就是不計算相關(guān)性分?jǐn)?shù)。
除了是否計算相關(guān)性算分的差別,經(jīng)常使用的過濾器將被Elasticsearch自動緩存,以提高性能。
我自己曾經(jīng)在一個項目中,對一個業(yè)務(wù)查詢場景做了這種優(yōu)化,當(dāng)時線上的索引文檔數(shù)量大概是3000萬左右,改成filter之后,查詢的速度幾乎快了一倍。
我截了幾張圖,你來感受下。
可以看到時間整個縮短了一半。
關(guān)于“ES中怎么利用filter提高查詢效率”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。