为什么Elasticsearch Scan / Scroll结果如此不同?

时间:2017-05-16 18:32:45

标签: elasticsearch elasticsearch-java-api

我正在执行扫描/滚动以重新映射群集中的索引(v2.4.3),并且我无法理解结果。在head plugin中,我的原始索引具有以下大小/ doc count:

尺寸:1.74Gi(3.49Gi)

docs:708,108(1,416,216)

如果我对此索引执行_reindex命令,我会得到一个具有相同文档数和相同大小的新索引。

但是如果我执行扫描/滚动来复制索引,我最终会在我的新索引中添加更多记录。我现在正处于流程的中间,这是新索引的当前状态:

尺寸:1.81Gi(3.61Gi)

docs:6,492,180(12,981,180)

为什么新索引中的文档与旧索引中的文档数量相比更多?映射文件声明了13个嵌套对象,但我没有更改两个索引之间嵌套对象的数量。

这是我的扫描/滚动代码:

    SearchResponse response = client.prepareSearch("nas")
            .addSort(SortParseElement.DOC_FIELD_NAME, SortOrder.ASC)
            .setScroll(new TimeValue(120000))
            .setQuery(matchAllQuery())
            .setSize(pageable.getPageSize()).execute().actionGet();

    while (true) {
        if (response.getHits().getHits().length <= 0) break; //break out of the loop if failed

        long startTime = System.currentTimeMillis();
        List<IndexQuery> indexQueries = new ArrayList<>();
        Arrays.stream(response.getHits().getHits()).forEach(hit -> {
            NasProduct nasProduct = null;
            try {
                nasProduct = objectMapper.readValue(hit.getSourceAsString(), NasProduct.class);
            } catch (IOException e) {
                logger.error("Problem parsing nasProductJson json: || " + hit.getSourceAsString() + " ||", e);
            }
            if (nasProduct != null) {
                IndexQuery indexQuery = new IndexQueryBuilder()
                        .withObject(nasProduct)
                        .withId(nasProduct.getProductKey())
                        .withIndexName(name)
                        .withType("product")
                        .build();
                indexQueries.add(indexQuery);
            }
        });
        elasticsearchTemplate.bulkIndex(indexQueries);
        logger.info("Index updated update count: " + indexQueries.size() + " duration: " + (System.currentTimeMillis() - startTime) + " ms");

        response = client.prepareSearchScroll(response.getScrollId())
                .setScroll(new TimeValue(120000))
                .execute().actionGet();
    }

0 个答案:

没有答案