Elasticsearch Search Scroll API 不会从索引中检索所有文档



我想从Elasticsearch检索所有文档,所以我引用了Search Scroll API。

但我的问题是,它并没有返回所有文件,我在一个索引中有36个文件,因此它只返回了26个。

即使我用另一个索引进行检查,我有超过1万份文件,它也不会返回最后10份文件。

我真的不知道它为什么会那样退货!任何帮助都将不胜感激!提前感谢!

在我尝试过的代码下面:

final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
SearchRequest searchRequest = new SearchRequest("myindex");
searchRequest.scroll(scroll);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query("")//here some query;
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); 
String scrollId = searchResponse.getScrollId();
SearchHit[] searchHits = searchResponse.getHits().getHits();
while (searchHits != null && searchHits.length > 0) { 

SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); 
scrollRequest.scroll(scroll);
searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchResponse.getScrollId();
searchHits = searchResponse.getHits().getHits();
for (SearchHits hit: searchHits){
String source=hit.getSourceAsString();
}
}
ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); 
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
boolean succeeded = clearScrollResponse.isSucceeded();

今天,我在处理的一个示例时遇到了同样的问题

弹性卷轴API

首先,关于您错过的文档-10是请求大小的默认值,基于此,我们可以假设您的一个请求没有得到正确处理。在您的代码中,第一批10个文档未被处理:

SearchHit[] searchHits = searchResponse.getHits().getHits();

while循环之前,您应该迭代搜索点击次数。从第一次开始,我就不清楚官方文件中的内容。

您应该更改while循环逻辑,以便首先执行hit迭代,然后执行滚动。

while (searchHits != null && searchHits.length > 0) {
// execute this block first otherwise the scroll will overwrite the initial hits.
for (SearchHits hit: searchHits){
String source=hit.getSourceAsString();
}
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(scroll);
searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchResponse.getScrollId();
searchHits = searchResponse.getHits().getHits();
}

另一件需要考虑的事情是,您可以增加响应命中大小。来自文档:

默认为10000的index.max_result_window是一种保护措施,搜索请求占用堆内存,时间与from+大小成比例。

因此max_result_window的默认值为10k次点击,您也可以将此值设置为其他值。这意味着您可以在一次搜索调用中获得高达10k次的点击,而不是执行冗余的分页。

您可以在执行搜索调用之前为searchSourceBuilder指定size属性,如下所示:

searchSourceBuilder.size(10000); 

相关内容

  • 没有找到相关文章

最新更新