1

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

0 回答 0