这是我的情况:
我有一个包含用户列表的页面。我通过Web界面创建一个新用户,并将其保存到服务器。服务器在elasticsearch中为文档建立索引并成功返回。然后,我被重定向到不包含新用户的列表页面,因为它可能需要1秒钟的时间才能使文档在Elasticsearch中可供搜索
elasticsearch中的近实时搜索。
elasticsearch指南说您可以手动刷新索引,但说在生产中不要这样做。
…不要在每次在生产环境中为文档编制索引时进行手动刷新;这会损害您的表现。相反,您的应用程序需要了解Elasticsearch的近实时性并为此留出余地。
我想知道其他人如何解决这个问题?我希望有一个事件或可以听的东西告诉我何时可以搜索该文档,但似乎没有类似的东西。仅等待1秒是合理的,但似乎是个坏主意,因为它可能花费的时间要少得多。
谢谢!
即使可以强制ES刷新自身,您也已经正确注意到它可能会损害性能。解决此问题以及人们经常做的事情(包括我自己)的解决方案是给人一种 实时 的
错觉 。最后,这仅是用户体验的挑战,而不是真正的技术限制。
重定向到用户列表时,您可以人为地将刚创建的新记录包括在用户列表中,就像该记录是ES本身返回的一样。没有什么可以阻止您这样做的。而且,当您决定刷新页面时,ES会正确返回新的用户记录,并且没人在乎该记录的来源,此时用户所关心的只是他想查看新记录,他刚刚创建,只是因为我们习惯于顺序思考。
实现此目的的另一种方法是,重新加载一个空的用户列表框架,然后通过Ajax或其他异步方法,检索用户列表并显示它。
还有另一种方法是在UI上提供视觉提示/线索,表明在后台发生了某些事情,并且预计很快就会有更新。
最后,一切归结为不是让用户惊讶,而是给他们足够的线索,以了解发生了什么,正在发生什么以及他们仍应该期望发生什么。
更新 :
出于完整性考虑,此答案早于ES5,后者引入了一种方法,以确保在搜索索引或返回错误代码后文档可见之前,索引调用不会返回。通过?refresh=wait_for
在索引数据时使用,可以确定ES响应时,新数据将被索引。
问题内容: 我的 单元/集成测试 包括搜索功能的测试。 我的想法是在每次测试之前有一个空的搜索索引。因此,我正在尝试删除方法(它是Groovy代码)的索引中的所有元素: 似乎它正在异步处理所有删除操作,因此在它之后添加了它。如您所见,我尝试几次打开/关闭连接-在那里没有帮助。 这个问题有时需要更多时间,有时需要5秒钟以上才能删除,有时无法找到刚刚添加的数据(来自先前的测试),等等。而最令人烦恼的是
问题内容: 自几个月前以来,我的集群每天都有一个索引,每个索引有5个分片(默认),并且由于分片太多(超过1000个),我无法在整个集群上运行查询。 文档ID是自动生成的。 如何将索引合并为一个索引,处理有冲突的ID(甚至可能发生冲突)并更改类型? 我正在使用ES版本5.2.1 问题答案: 仅在使用ELK堆栈几个月并逐日创建索引后才可见的常见问题。这里有一些选项可以解决性能问题。 首先,您可以用来限
问题内容: 我每天创建索引来存储搜索历史,并且我将这些索引用于应用程序中的建议,这也有助于我根据历史建议。 现在我只需要维持过去的10天历史。那么elasticsearch中是否有任何功能可以让我定期创建和删除索引? 问题答案: 我唯一能想到的就是使用数据数学:https : //www.elastic.co/guide/en/elasticsearch/reference/current/dat
问题内容: 我在ElasticSearch和Rails时遇到问题,由于attr_protected,其中一些数据未正确索引。Elastic Search在哪里存储索引数据?检查实际的索引数据是否错误将很有用。 检查映射对您没有帮助,将列出该字段。 问题答案: 探索您的ElasticSearch集群的最简单方法可能是使用elasticsearch -head。 您可以通过以下方式安装它: 然后(假设
主要内容:创建索引,删除索引,获取索引,测试索引存在,打开/关闭索引API,索引别名,索引设置,分析,索引模板,索引统计,刷新清除数据, 刷新索引这些API负责管理索引的所有方面,如设置,别名,映射,索引模板。 创建索引 此API可用于创建索引。 当用户将对象传递到任何索引时,可以自动创建索引,也可以在此之前创建索引。 要创建索引,只需要发送包含设置,映射和别名的发布请求,或者只发送一个没有正文的简单请求。 例如, 响应 或者,加上一些设置 - 请求正文 响应 或使用映射 - 请求正文 响应 或