[英]optimize elasticsearch query using filter, query or mix of both
我正在嘗試提高Elasticsearch查詢的性能。 查詢的目的只是檢索與查詢匹配的那些文檔,因此得分無所謂,提到我們每天都有一個索引也很重要,因此很奇怪。 據我所知,在這種情況下最好使用過濾器,避免計算得分,但是我只是紅色表示在查詢中使用finter檢索所有文檔得分為1有一些替代方法,所以我進行的第一個查詢是followig :
{
"filter": {
"bool": {
"must": [{
"match": {
"from": "john.doe@example.com"
}
}, {
"range": {
"receivedDate": {
"gte": "date1",
"lte": "date2"
}
}
}
]
}
}
}
然后,我進行了第一個測試,並更改了“查詢”的“過濾器”,並且在大多數情況下,我使用“查詢”而不是“過濾器”獲得更好的成績,這是我的第一個問題,為什么? 我在查詢中做錯了什么以使篩選器比查詢慢?
之后,我繼續閱讀以嘗試改進它,我得到了:
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"bool": {
"must": [{
"match": {
"from": "john.doe@example.com"
}
}, {
"range": {
"receivedDate": {
"gte": "date1",
"lte": "date2"
}
}
}
]
}
}
}
}
}
對於后者,我的印象有所改善。 因此,根據您的經驗,您能否告訴我哪一個更好(至少在理論上)可以獲得更快的結果,還存在使用該查詢之一緩存結果以改善提出的查詢的機會。 有沒有更好的方法來進行此查詢? 在此先感謝您的幫助。 我忘了提我正在使用Elasticsearch v2.3
在第一個查詢中,您僅使用post_filter
。 第二個查詢是解決方法,但可以對此進行優化(無需將bool/filter
包裹在bool/must
):
{
"query": {
"bool": {
"filter": [
{
"range": {
"receivedDate": {
"gte": "date1",
"lte": "date2"
}
}
},
{
"term": {
"from": "john.doe@example.com"
}
}
]
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.