弹性搜索批量查询需要30分钟,这是正常的吗?

时间:2018-02-13 19:39:40

标签: java elasticsearch bigdata cluster-computing elasticsearch-6

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

0 个答案:

没有答案
相关问题