ElasticSearch 文档 refresh=true 似乎不起作用

ElasticSearch document refresh=true does not appear to work

为了加快我们网站上的搜索速度,我创建了一个小型弹性搜索实例,它保留了我们数据库中所有“可搜索”字段的副本。它仅包含几百万个文档,每个文档的平均大小约为 1KB。目前(在开发中)我们只有 2 个节点,但在生产中可能需要更多节点。

我们的应用程序是一个“主要阅读”应用程序 - 可能有 1000 个 documents/day 得到更新,但它们被阅读和搜索了 10 个 times/day。

每个文档代表工单系统中的一个案例,随着用户研究和关闭案例,该案例可能会在白天更改状态。如果研究人员关闭一个案例,然后立即刷新他的未完成工作队列,我们​​预计该案例会从他们的队列中消失,这是由对我们的 Elastic Search 实例的查询驱动的,按状态过滤。状态是案例索引中的一个字段。

我们收到的抱怨是,当研究人员关闭案例时,在立即刷新他的队列后,在筛选“进行中”案例时案例仍然会返回。如果他在一两秒后刷新视图,它就消失了。

为了解决这个问题,我在更新文档时添加了 refresh=true,例如 curl -XPUT 'https://my-dev-es-instance.com/cases/_doc/11?refresh=true' -d '{"status":"closed", ... }'

但问题依旧。

这是我从上述请求中得到的回复:

{"_index":"cases","_type":"_doc","_id":"11","_version":2,"result":"updated"," forced_refresh":true,"_shards":{"total":2,"successful":1,"failed":0}," =45=]":70757,"_primary_term":1}

响应似乎验证了 forced_refresh 请求已收到,尽管它确实表示在总共 2 个分片中,1 个成功,0 个失败。不确定另一个,但由于我只有 2 个节点,这是否意味着它更新了辅助节点?

根据 doc要在操作发生后立即刷新分片(不是整个索引),以便文档立即出现在搜索结果中,refresh参数可以设置为true。将此选项设置为 true 应该仅在仔细考虑并验证它不会导致性能不佳之后进行,无论是从索引还是搜索的角度来看。请注意,使用 get API 获取文档是完全实时的,不需要刷新。

我的期望合理吗?有更好的方法吗?

经过更多测试,我得出结论,我的问题是由于应用程序逻辑错误,而不是 ElasticSearch 的问题。刷新标志的行为符合预期。为错误信息道歉。