2012-12-22 82 views
3

的這個查詢需要每次執行時間超過200毫秒:業績彈性查詢

{ 
    "filter": { 
    "term": { 
     "id": "123456", 
     "_cache": true 
    } 
    } 
} 

但是這一次只需要每次它是在第一次查詢後執行時間2-3毫秒:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "term": { 
      "id": "123456" 
     } 
     } 
    } 
    } 
} 

請注意兩個查詢中的ID值相同。看起來第二個查詢使用來自第一個查詢的緩存結果。但爲什麼第一個查詢不能使用緩存結果本身?從第一個查詢中刪除"_cache" : true不會改變任何內容。

當我使用其他ID執行第二個查詢時,第一次需要約40毫秒的時間,之後每次需要2-3毫秒。因此,第二個查詢不僅工作得更快,而且還緩存結果並將緩存用於後續調用。

是否有解釋所有這一切?

回答

5

第一個請求中的頂級filter元素在Elasticsearch中具有非常特殊的功能。它用於過濾搜索結果而不影響構面。爲了避免干擾facet,這個過濾器在收集結果期間而不是在搜索期間被應用,這導致其性能下降。使用沒有構面的頂層filter幾乎沒什麼意義,因爲filteredconstant_score查詢通常會提供更好的性能。如果filtered查詢與match_all的冗長困擾你,你可以重寫你的第二個請求轉換成等價constant_score查詢:

{ 
    "query": { 
    "constant_score": { 
     "filter": { 
     "term": { 
      "id": "123456" 
     } 
     } 
    } 
    } 
} 
+0

它不會打擾我。我正在嘗試學習如何以最有效的方式查詢Elastic,他們寫得不好的文檔對我無能爲力。所以我在這裏問所有這些問題。再次感謝您的幫助! – Andrei