簡體   English   中英

使用過濾器,查詢或兩者結合來優化Elasticsearch查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM