我每天将大约 2000 万个文档存储到一个弹性搜索 (6x) 索引中,我的主分片具有不同的参数,并且两者的副本计数范围从 2 到 5(这是在具有快速硬件的 5 节点集群中运行)每次我运行批处理以从索引中提取所有文档,使用滚动遍历所有这些数据需要 30 分钟以上,我花了很多时间尝试阅读设置滚动大小、使用恒定分数等内容. 没有太多运气来提高我的搜索速度。
我的问题是,当我需要返回所有字段(每个文档大约 30 个字段)时,我是否在搜索查询需要 30 分钟以上按日期/时间字段对 2000 万条记录进行排序时做错了什么?批量搜索的课程?我的代码在下面显示了我如何构建查询并执行它,并希望有人可以帮助我弄清楚是否有更好的方法来编写代码,从而提高性能。
BoolQueryBuilder query = QueryBuilders.boolQuery();
if(_input.getStartTime() != null && _input.getStopTime() != null) {
query.must(new TermQueryBuilder("XTYPE", 1));
String fromDateTime = ElasticQueryHelper.createDateTimeStamp2(
_input.getStreamDate(), _input.getStartTime());
String toDateTime = ElasticQueryHelper.createDateTimeStamp2(
_input.getStreamDate(),_input.getStopTime());
LocalDateTime from = LocalDateTime.parse(fromDateTime,_dateTimeFormatter);
LocalDateTime to = LocalDateTime.parse(toDateTime,_dateTimeFormatter);
query.filter(QueryBuilders.rangeQuery("XDATETIME")
.from(fromDateTime).includeLower(true).to(toDateTime)
.includeUpper(true));
}
ConstantScoreQueryBuilder queryWrapper = QueryBuilders.constantScoreQuery(query);
try {
SearchResponse response = null;
response = _elasticTransport.getClient().prepareSearch()
.setSearchType(SearchType.QUERY_THEN_FETCH)
.setIndices(_input.getElasticIndex())
.setTypes("row")
.addStoredField("*")
.setScroll(new TimeValue(50000))
.setSize(20000)
.setFetchSource(true)
.setQuery(queryWrapper)
.addSort("XDATETIME", SortOrder.ASC)
.execute().actionGet();
//
return response;
} catch (Exception e) {
throw new XCacheStreamWriterException("Exception executing elastic search query " + e.toString());
}