2015-02-08 75 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