不为失败找理由,要为成功找方法。

ElasticSearch2.4.6 + Spring termsQuery 查询速度奇慢问题

Elasticsearch | 作者 linfujian | 发布于2018年08月29日 | 阅读数:3509

termsQuery 返回大约三千多条记录,但是查询速度奇慢,不知道有没有大神知道如何解决
已邀请:

rochy - rochy_he

赞同来自: linfujian

1. 如果 pmid 是 文档 id, 你可以使用 idsQuery;
2. 推荐将 第二个rangeQuery 前面的 must 换为 filter;
3. 如果只需要 title 字段,则最好指定返回的字段,而不是获取_source 的内容;
4. 你可以看一下 最好返回的内容的 took 的耗时,这个才是查询耗时,感觉你的耗时应该是耗费在了网络传输;
5. 你的获取总数和获取分页内容是可以合并在一起的。

linfujian

赞同来自:

补充一下,返回结果总数三千多条左右,分页每页20条,每次分页的查询速度特别慢

qw8613243

赞同来自:

这原因有很多 贴出来你的分片设置 返回有没有大字段? 有大字段查询吗? 分配给es的堆内存多少?

linfujian

赞同来自:

//开始查询
BoolQueryBuilder booleanQueryBuilder = QueryBuilders.boolQuery();
booleanQueryBuilder
.must(QueryBuilders.termsQuery("pmid", crossSet)); //此处限制入参size<5000, 本次查询返回数量为5000
if(crossSet.size() >5000 && "all".equals(ifRange)) { //假如满足条件的文章概要记录总数大于5000,则添加过滤条件:ifactor>3
booleanQueryBuilder
.must(QueryBuilders.rangeQuery("IF").gte(Float.parseFloat("3")));
}
//实时查询记录总数
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(booleanQueryBuilder)
.withIndices("pmid_title")
.withTypes("pmid_title_list")
.build();
long totoalCount = esUtil.count(searchQuery); //此处耗时7~8秒
result.put("count", totoalCount);
//分页查询
SearchQuery searchQuery2 = new NativeSearchQueryBuilder()
.withQuery(booleanQueryBuilder)
.withIndices("pmid_title")
.withTypes("pmid_title_list")
.withPageable(new PageRequest(page-1, rows))
.build();
titleList = esUtil.queryForPage(searchQuery2, Pmid2TitleEntity.class).getContent(); //此处耗时十几秒
 

linfujian

赞同来自:

谢谢,确实可以将总记录数和分页放在一个查询里

要回复问题请先登录注册