spring - ElasticsearchTemplate.scroll 是否返回新的 scrollId?

标签 spring elasticsearch spring-data

使用 Spring Data 时的ElasticsearchTemplate有一个scroll进行扫描和滚动技术的方法。在 Elasticsearch documentation您可以找到以下信息:

The initial search request and each subsequent scroll request returns a new _scroll_id — only the most recent _scroll_id should be used.



所以我想知道如何获得新的_scroll_id来自 Spring 的 scroll()然后我可以传递给下一个 scroll() 的方法称呼。我可以在返回的Page中找到它吗? ?我不这么认为。

最佳答案

我遇到了同样的问题。

Elasticsearch 日志充斥着 org.elasticsearch.search.SearchContextMissingException: No search context found for id .

这还没有在 Spring Data Elasticsearch 中实现。已经有此 DATAES-166 的 JIRA 票证和 pull request in github增加了这种功能。

直到最终合并,我才实现了这个类

public class ScrollPage<T> extends PageImpl<T> {

    private String scrollId;

    public ScrollPage(List<T> content, String scrollId) {
        super(content);
        this.scrollId = scrollId
    }

    public String getScrollId() {
        return scrollId;
    }
}

然后在我的请求中,我返回一个 ScrollPage 而不是 Page 并从 Elasticsearch 响应中设置新的 scrollId。
 String scrollId = elasticsearchTemplate.scan(searchQuery, 5000, false);
    List<Info> infos= new ArrayList<>();
    boolean hasRecords = true;
    while (hasRecords) {
        Page<Info> page = elasticsearchTemplate.scroll(scrollId, 5000L, new SearchResultMapper() {
            @Override
            public <T> ScrollPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
                List<Info> result = new ArrayList<>();
                for (SearchHit searchHit : response.getHits()) {
                    Info info= new Info();
                    String code= searchHit.getFields().get("code").getValue();
                    info.setCode(code)
                    result.add(info);
                }
                if (result.size() > 0) {
                   return new ScrollPage<T>((List<T>, response.getScrollId());
                }
                return null;
            }
        });
        if (page != null) {
            infos.addAll(page.getContent());
            scrollId = ((ScrollPage) page).getScrollId();
        } else {
            hasRecords = false;
        }
    }

这样弹性就不再提示了,日志也很清楚。

关于spring - ElasticsearchTemplate.scroll 是否返回新的 scrollId?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42020080/

相关文章:

elasticsearch - 在Elastic Search中找到与查询匹配的关键字

java - spring-data-aerospike `findAll(ids)` 结果返回 NULL

spring-boot - 在 spring boot/spring data elasticsearch 中禁用自动索引创建

java - Spring 内容集成 channel

java - 在 hibernate 中使用延迟加载时按需需要关系

java - JPA - EntityManager 查找方法返回重复项

elasticsearch - 如何在Elasticsearch中使用定义的分析器和分片创建索引?

javascript - 如何在Spring中将JSP页面上的AJAX JQuery制作为 Controller ?

elasticsearch - Elasticsearch 查询因query_string中的冒号而崩溃

java - Spring 数据在生产中休息