问题 如何处理Elasticsearch索引延迟


这是我的情景:

我有一个包含用户列表的页面。我通过我的Web界面创建一个新用户并将其保存到服务器。服务器在elasticsearch中索引文档并成功返回。然后我被重定向到不包含新用户的列表页面,因为文档可能需要1秒才能在elasticsearch中搜索

在elasticsearch中近实时搜索

elasticsearch指南表示您可以手动刷新索引,但表示不会在生产中执行此操作。

...每次在生产中索引文档时都不要手动刷新;这会伤害你的表现。相反,您的应用程序需要了解Elasticsearch的近实时性并为其做好准备。

我想知道别人怎么解决这个问题?我希望有一个事件或我可以听的东西会告诉我什么时候该文件可用于搜索,但似乎没有类似的东西。简单地等待1秒似乎是合理的,但这似乎是一个坏主意,因为它可能花费的时间比这少得多。

谢谢!


10003
2017-07-19 09:02


起源



答案:


即使您可以强制ES刷新自己,但您已经正确地注意到它可能会损害性能。围绕这个和人们经常做的一个解决方案(包括我自己)就是给出一个 实时幻觉。最后,它只是一个UX挑战,而不是真正的技术限制。

重定向到用户列表时,您可以人为地将刚刚创建的新记录包含在用户列表中,就好像ES本身已经返回该记录一样。没有什么可以阻止你这样做。当您决定刷新页面时,ES会正确返回新用户记录,没有人关心该记录的来源,当时用户关心的是他希望看到的新记录他刚刚创建,仅仅是因为我们习惯于顺序思考。

实现此目的的另一种方法是重新加载一个空的用户列表框架,然后通过Ajax或其他一些异步方式,检索用户列表并显示它。

另一种方法是在UI上提供视觉提示/线索,表明在后台发生了某些事情,并且很快就会发生更新。

最后,这一切都归结为不会让用户感到惊讶,而是给他们足够的线索,了解发生了什么,发生了什么以及他们应该发生什么。

UPDATE

为了完整起见,这个答案早于ES5,它引入了一种方法来确保索引调用不会返回,直到文档在搜索索引时可见或返回错误代码。通过使用 ?refresh=wait_for 索引数据时,您可以确定当ES响应时,新数据将被编入索引。


7
2017-12-21 08:05



当实际写入失败时会发生什么?你让人们相信它是创造出来的,而它却不是真的 - user310291
@ user310291你能详细说明吗? - Val
如果前端显示写入操作成功但实际上在后端写入失败,那么这将使用户在下一次操作时惊讶于保存的内容不存在。前端可以只显示一个闪光告诉用户它失败然后重置为真相。 - Clutch


答案:


即使您可以强制ES刷新自己,但您已经正确地注意到它可能会损害性能。围绕这个和人们经常做的一个解决方案(包括我自己)就是给出一个 实时幻觉。最后,它只是一个UX挑战,而不是真正的技术限制。

重定向到用户列表时,您可以人为地将刚刚创建的新记录包含在用户列表中,就好像ES本身已经返回该记录一样。没有什么可以阻止你这样做。当您决定刷新页面时,ES会正确返回新用户记录,没有人关心该记录的来源,当时用户关心的是他希望看到的新记录他刚刚创建,仅仅是因为我们习惯于顺序思考。

实现此目的的另一种方法是重新加载一个空的用户列表框架,然后通过Ajax或其他一些异步方式,检索用户列表并显示它。

另一种方法是在UI上提供视觉提示/线索,表明在后台发生了某些事情,并且很快就会发生更新。

最后,这一切都归结为不会让用户感到惊讶,而是给他们足够的线索,了解发生了什么,发生了什么以及他们应该发生什么。

UPDATE

为了完整起见,这个答案早于ES5,它引入了一种方法来确保索引调用不会返回,直到文档在搜索索引时可见或返回错误代码。通过使用 ?refresh=wait_for 索引数据时,您可以确定当ES响应时,新数据将被编入索引。


7
2017-12-21 08:05



当实际写入失败时会发生什么?你让人们相信它是创造出来的,而它却不是真的 - user310291
@ user310291你能详细说明吗? - Val
如果前端显示写入操作成功但实际上在后端写入失败,那么这将使用户在下一次操作时惊讶于保存的内容不存在。前端可以只显示一个闪光告诉用户它失败然后重置为真相。 - Clutch


Elasticsearch 5可以选择阻止索引请求,直到下一次刷新为止:

?refresh=wait_for

看到: https://www.elastic.co/guide/en/elasticsearch/reference/5.0/docs-refresh.html#docs-refresh


6
2017-12-07 14:13