在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

ES中存储的数据量为100万条,当根据条件查询ES中符合条件的所有数据时,ES查询速率很慢,需要一分多钟。那么请问在这种情况下,怎样才能提高ES的查询效率呢?

Elasticsearch | 作者 jnliao | 发布于2017年08月26日 | 阅读数:22129

根据条件查询es中符合条件的所有数据的java核心代码如下所示:
List<Customer> customers = new ArrayList<>();
SearchResponse response = client.prepareSearch(customerIndex)
.setTypes(customerType)
.setScroll(TimeValue.timeValueMinutes(1))
.setQuery(boolQueryBuilder)
.setSize(10000)
.get();
do {
customers = getCustomers(customers,response);
response = client.prepareSearchScroll(response.getScrollId()).setScroll(TimeValue.timeValueMinutes(1)).execute().actionGet();
} while(response.getHits().getHits().length != 0);
 
 
 
已邀请:

kennywu76 - Wood

赞同来自: laoyang360 jnliao More_lingyang

我觉得和ES没有关系,是代码逻辑有问题。
 
看起来这段代码是通过scoll查询将满足条件的几十万条数据,1万条一个批次分批取回。 while循环里,想通过下面这个方法:


customers = getCustomers(customers,response);


将response里解析出来的结果放到customers这个list里面。 
 
这个赋值是做了对象的拷贝,意味着每次迭代,就拷贝一个更大的list,越来越慢。  正确的做法是每次迭代解析出response里的结果后,直接add到customers列表。
 
 

jnliao

赞同来自:

boolQueryBulid查询语句如下所示:
QueryBuilder queryBuilder_01 = rangeQuery("age").gt(Integer.parseInt("20")); QueryBuilder queryBuilder_02 = rangeQuery("income_month").gt(Double.parseDouble("10000")); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(queryBuilder_01); boolQueryBuilder.must(queryBuilder_02);
是比较标准的查询,但是查询确实很慢。ES中存个几十万条数据时查询就需要60s左右。希望各位不吝赐教。

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

你需要一次处理返10000条数据吗?
这里需要优化下

freeboy

赞同来自:

你试试客户端不调用close()方法。这个好像是使用Transport JAVA API的一个缺陷。

Cheetah

赞同来自:

如果1.7版本,设置scan模式,如果后面的版本,设置doc排序

novia - 1&0

赞同来自:

很标准的一个查询,感觉没有啥可优化的,可以贴下你的查询语句,boolQueryBulid

要回复问题请先登录注册