使用 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/