我有两个名称为source_index
、destination_index
的索引
这两个索引具有相同的Map。
我已经编写了以下代码来进行重新索引和搜索请求-
@Autowired
RestHighLevelClient client;
public BulkByScrollResponse reIndexElasticResponse(ReindexRequest reindexRequest){
BulkByScrollResponse reindexResponse = null;
try{
reindexResponse = client.reindex(reindexRequest,RequestOptions.DEFAULT);
} catch (IOException e){
throw new RuntimeException(e);
}
return reindexResponse;
}
public SearchResponse searchElasticResponseByScrollAPI(SearchScrollRequest searchScrollRequest) {
SearchResponse searchResponse = null;
try {
searchResponse = client.scroll(searchScrollRequest,RequestOptions.DEFAULT);
} catch (IOException e) {
throw new RuntimeException(e);
}
return searchResponse;
}
现在,我的应用程序正在将仅选定的记录从source_index
重新索引到destination_index
。就在重建索引请求之后,我在destination_index
上运行了一个搜索查询。
问题是我的搜索查询没有给出正确的响应,因为我认为重建索引请求没有以同步的方式工作。如果我在重建索引请求后使用Thread.sleep(5000);
,那么我的搜索查询会给出正确的结果。
reIndexElasticResponse(reindexRequest);
Thread.sleep(5000);
searchElasticResponseByScrollAPI(searchScrollRequest);
上面的代码可以很好地工作。但是如果我注解Thread.sleep(5000)
,那么搜索查询不会给出预期的输出。
我希望我的程序等到所有记录都重新编制了索引,然后在destination_index
上运行搜索查询
1条答案
按热度按时间svgewumm1#
这是预期行为,因为提交索引后应该需要一些时间来刷新索引(默认为1秒)。你可以阅读Val here提供的答案,这将让你更清楚为什么会发生这种情况。
因此,当您在代码中设置
Thread.sleep(5000);
时,Elastic能够完成索引刷新,因此您能够获得搜索响应。下面的代码更改可以在代码中进行,以强制刷新索引。