2013-07-19 58 views
5

令我讀過this question和我的一個同事讓我懷疑:查詢VS過濾器 - 執行

在過濾查詢,在應用過濾器?執行查詢之前還是之後?緩存的結果是什麼時候?

如果預先應用過濾器,在過濾器中複製查詢部分不是一件好事嗎? 如果之後應用過濾器,那麼我無法理解緩存的內容。

回答

9

幸運的是,ES提供了兩種類型的過濾器,爲您與工作:

{ 
    "query" : { 
    "field" : { "title" : "Catch-22" } 
    }, 
    "filter" : { 
    "term" : { "year" : 1961 } 
    } 
} 


{ 
    "query": { 
    "filtered" : { 
     "query" : { 
     "field" : { "title" : "Catch-22" } 
     }, 
     "filter" : { 
     "term" : { "year" : 1961 } 
     } 
    } 
    } 
} 

在第一種情況下,過濾器適用於通過查詢找到的所有文件。在第二種情況下,文檔在查詢運行之前被過濾。這產生更好的性能。

引自:http://www.packtpub.com/elasticsearch-server-for-fast-scalable-flexible-search-solution/book

關於緩存,我不知道有關的過濾器緩存機制。 我的猜測是: 第一種情況,由於過濾器是針對查詢返回的一組結果,因此緩存對於此返回集是特定的。 第二種情況,首先應用過濾器,緩存存儲爲您檢查的索引,因此,此緩存更具可重用性,因爲它不依賴於查詢的內容,但是在較大的內存成本和第一次查詢時間時間(在生成緩存之前)。

1

讓我解釋一下你搜索查詢execution-

第一件事是,總有你想要搜索的參考一個完整的文件。

如果您的搜索查詢中包含過濾器查詢,那麼它只會使該文檔變小或換句話說過濾器查詢是相同查詢的緩存結果。 現在你有一個更小的樹來搜索你的查詢文本。

現在您的疑問部分 - 複製過濾器中的查詢將只會增加緩存機制的開銷,並且有許多關於要在過濾器查詢中包含的內容以及要忽略的內容的指導行。這都是相關性的遊戲。