我编写了一个使用高级 Elasticsearch API 的 REST API (javax.ws.rs)。这是 ES 7.2 的情况。
客户端需要对记录建立索引,然后执行包含该记录的搜索,并且在索引操作之后文档实际出现在搜索中之前存在一些延迟。
有没有办法阻止索引操作,直到新的索引记录出现在搜索结果中?
如果做不到这一点,有没有办法获得文档现在可搜索的异步通知?
为了了解我的用例,这里是来自客户端的代码:
const cr = await this.client.dNodeCreate(fixedNode).toPromise();
const fr = await this.client.dNodeGetById(cr._id).toPromise();
await this.client.dNodeCreate(replyRoot).toPromise();
Run Code Online (Sandbox Code Playgroud)
第一行向 ES 发出 Index 请求,并返回状态对象。该对象包含新文档的 ID。
第二行通过 ID 获取记录。这总是有效的。
第三行失败。它尝试索引的文档取决于第一个文档,REST 中间件尝试通过搜索(而不是 ID)查找该文档。这相当于 REST 层强制执行的 SQL 关系。
我总是可以通过在第三次调用之前引入延迟(例如 1500 毫秒)来使代码正常工作,但这实际上是一个非鲁棒的解决方案。它可能始终在开发模式下工作(所有服务器都在我的笔记本电脑上,没有其他用户),但无法预测实际生产中需要延迟多长时间。
更新: 已解决。
下面标记的答案似乎可以解决问题。作为参考,Java API 中所需的调用如下所示:
IndexRequest req = new IndexRequest(DNode.INDEX);
req.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
Run Code Online (Sandbox Code Playgroud)
“刷新”参数就是您要查找的参数。来自Elasticsearch 文档:
刷新 (Index API) :) 如果为 true,Elasticsearch 会刷新受影响的分片以使此操作对搜索可见,如果 wait_for 则等待刷新以使此操作对搜索可见,如果为 false,则不执行任何刷新操作。有效值:true、false、wait_for。默认值:假
所以你的索引请求应该是这样的:
PUT /<index>/_doc/<_id>?refresh=wait_for
Run Code Online (Sandbox Code Playgroud)
我不相信有一种内置方法可以获取文档现在可搜索的异步通知。话虽这么说,如果您已经有权访问文档 ID,那么在代码中使用它而不是搜索可能更有意义。
归档时间: |
|
查看次数: |
2011 次 |
最近记录: |