我每天将大约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());
}