这是我的情景:
我有一个包含用户列表的页面。我通过我的Web界面创建一个新用户并将其保存到服务器。服务器在elasticsearch中索引文档并成功返回。然后我被重定向到不包含新用户的列表页面,因为文档可能需要1秒才能在elasticsearch中搜索
Near real-time search in elasticsearch
elasticsearch指南说你可以手动刷新索引,但是说不要在生产中这样做。
...每次在生产中索引文档时都不要进行手动刷新;这会伤害你的表现。相反,您的应用程序需要了解Elasticsearch的近实时性质并为其做好准备。
我想知道其他人如何解决这个问题?我希望有一个事件或者我能听到的东西会告诉我什么时候该文件可用于搜索,但似乎没有这样的东西。简单地等待1秒似乎是合理的,但这似乎是一个坏主意,因为它可能花费的时间远远少于此。
谢谢!
答案 0 :(得分:6)
Elasticsearch 5可以选择阻止索引请求,直到下一次刷新为止:
?refresh=wait_for
请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/5.0/docs-refresh.html#docs-refresh
答案 1 :(得分:0)
这是一段代码,这是我在Angular应用程序中为解决此问题所做的事情。在组件中:
async doNewEntrySave() {
try {
const resp = await this.client.createRequest(this.doc).toPromise();
this.modeRefreshDelay = true;
setTimeout(() => {
this.modeRefreshDelay = false;
this.refreshPage();
}, 2500);
} catch (err) {
this.error.postError(err);
}
}
在模板中:
<div *ngIf="modeRefreshDelay">
<h2>Waiting for update ...</h2>
</div>
我知道这是一个快速解决方案,但是它说明了用户体验应该如何工作。显然,如果实际延迟超过2.5秒,它就会中断。更高版本会循环播放,直到新记录出现在页面延迟中(当然有限制)。
除非您完全重新设计ElasticSearch,否则在成功索引操作和该文档在搜索结果中显示的时间之间始终会有一定的延迟。
答案 2 :(得分:-2)
建立索引后,数据应立即可用。几个常见问题:
您是否检查过CPU和RAM,以确定是否要对ES群集加税?如果是这样,您可能需要加强硬件配置才能解决。 ES喜欢RAM!
您是否正在使用NAS(网络连接存储)或虚拟存储(如EBS)?由于延迟,Elastic建议不要这样做。如果您可以使用DAS(直接连接)和SSD,您的状况将会好得多。
为您提供一个AWS示例,从m4.xlarge实例迁移到r3.xlarge可以为我们带来巨大的性能提升。