使用Java REST高级客户端的ElasticSearch重新索引请求未以同步方式工作

krugob8w  于 2022-10-06  发布在  Java
关注(0)|答案(1)|浏览(235)

我有两个名称为source_indexdestination_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上运行搜索查询

svgewumm

svgewumm1#

这是预期行为,因为提交索引后应该需要一些时间来刷新索引(默认为1秒)。你可以阅读Val here提供的答案,这将让你更清楚为什么会发生这种情况。

因此,当您在代码中设置Thread.sleep(5000);时,Elastic能够完成索引刷新,因此您能够获得搜索响应。

下面的代码更改可以在代码中进行,以强制刷新索引。

public BulkByScrollResponse reIndexElasticResponse(ReindexRequest reindexRequest){
    BulkByScrollResponse reindexResponse = null;
    try{
      reindexRequest.setRefresh(true); <--- check this one
      reindexResponse = client.reindex(reindexRequest,RequestOptions.DEFAULT);
    } catch (IOException e){
      throw new RuntimeException(e);
    }
    return reindexResponse;
}

相关问题