这是我的情况:
我有一个包含用户列表的页面。我通过Web界面创建一个新用户,并将其保存到服务器。服务器在elasticsearch中为文档建立索引并成功返回。然后,我被重定向到不包含新用户的列表页面,因为它可能需要1秒钟的时间才能使文档在Elasticsearch中可供搜索
elasticsearch中的近实时搜索。
elasticsearch指南说您可以手动刷新索引,但说在生产中不要这样做。
…不要在每次在生产环境中为文档编制索引时进行手动刷新;这会损害您的表现。相反,您的应用程序需要了解Elasticsearch的近实时性并为此留出余地。
我想知道其他人如何解决这个问题?我希望有一个事件或可以听的东西告诉我何时可以搜索该文档,但似乎没有类似的东西。仅等待1秒是合理的,但似乎是个坏主意,因为它可能花费的时间要少得多。
谢谢!
即使可以强制ES刷新自身,您也已经正确注意到它可能会损害性能。解决此问题以及人们经常做的事情(包括我自己)的解决方案是给人一种 实时 的 错觉 。最后,这仅是用户体验的挑战,而不是真正的技术限制。
重定向到用户列表时,您可以人为地将刚创建的新记录包括在用户列表中,就像该记录是ES本身返回的一样。没有什么可以阻止您这样做的。而且,当您决定刷新页面时,ES会正确返回新的用户记录,并且没人在乎该记录的来源,此时用户所关心的只是他想查看新记录,他刚刚创建,只是因为我们习惯于顺序思考。
实现此目的的另一种方法是,重新加载一个空的用户列表框架,然后通过Ajax或其他异步方法,检索用户列表并显示它。
还有另一种方法是在UI上提供视觉提示/线索,表明在后台发生了某些事情,并且预计很快就会有更新。
最后,一切归结为不是让用户惊讶,而是给他们足够的线索,以了解发生了什么,正在发生什么以及他们仍应该期望发生什么。
更新 :
出于完整性考虑,此答案早于ES5,后者引入了一种方法,以确保在搜索索引或返回错误代码后文档可见之前,索引调用不会返回。通过?refresh=wait_for在索引数据时使用,可以确定ES响应时,新数据将被索引。
?refresh=wait_for