2015-02-08 91 views
1

我有以下字段A,B,C,d的文檔時,E.Elasticsearch java的查詢優化

我可以查詢以獲得在以下2種方式A的和B的值

方法1:

SearchResponse response1 = client 
      .prepareSearch("indexname") 
      .setTypes("all") 
      .setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), FilterBuilders.termFilter("C", "SOME_VALUE"))) 
      .execute().actionGet(); 

然後分析源獲得字段A和B.

方法2

String[] fields = {"A", "B"}; 
    SearchResponse response1 = client 
      .prepareSearch("indexname") 
      .setTypes("all") 
      .setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), FilterBuilders.termFilter("C", "SOME_VALUE"))) 
      .addFields(fields) 
      .execute().actionGet(); 

現在直接解析字段而不是源。

我比較了兩個查詢所花費的時間。結果不一致。然而,對於方法2,響應時間傾向於更低。但是它不是確定的。所以任何人都可以肯定地告訴我,哪種方法更快,爲什麼?

回答

0

對於每個結果文檔,第一個方法必須獲取所有字段的值,而第二個方法只需要獲取字段A和B的值。這就是方法2更快的原因。方法2也比較乾淨,因爲您可以直接獲取字段A和B的值,並且不需要在客戶端應用自定義分析邏輯。

你爲什麼啓用_source字段的原因是什麼?獲取_source字段的值當然需要額外的時間,更不用說它也會在索引中產生存儲開銷。有關更多信息,請參閱this。因此,除非絕對必要,否則可以嘗試禁用_source字段。

+0

我是ES的新手。所以你的意思是說,在我的索引映射中,我應該做'存儲:是'並禁用_source? – 2015-02-08 16:27:56

+0

根據這個 http://stackoverflow.com/questions/15299799/elasticsearch-impact-of-setting-a-not-analyzed-field-as-storeyes 如果我禁用_source,它將被讀取一個磁盤每個字段我想要獲取。啓用_source可以在一次磁盤讀取中爲我提供所有字段。而我基本需要的是能夠根據某個領域的特定價值獲得任何領域。很像一個數據庫。 – 2015-02-08 16:46:11

+0

「_source」字段的一個磁盤讀取邏輯僅適用於文檔非常小且需要讀取大量字段的情況。在你的情況下,它看起來不像。將'store'標記爲'yes'並禁用'_source'應該足夠適合您。 – bittusarkar 2015-02-08 17:17:24