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

Posted

技术标签:

【中文标题】ElasticSearch 文档 refresh=true 似乎不起作用【英文标题】:ElasticSearch document refresh=true does not appear to work 【发布时间】:2021-11-12 13:33:51 【问题描述】:

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

我们的应用程序是一个“主要阅读”应用程序 - 可能每天更新 1000 个文档,但它们每天被阅读和搜索成千上万次。

每个文档代表票务系统中的一个案例,当用户研究和关闭案例时,该案例可能会在白天改变状态。如果研究人员关闭了一个案例,然后立即刷新了他的开放工作队列,我们​​预计该案例将从他们的队列中消失,这是由对我们的 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,"_seq_no":70757,"_primary_term":1 p>

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

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

我的期望合理吗?有没有更好的方法来做到这一点?

【问题讨论】:

你试过清除缓存吗?使用cases/_cache/clear?query=true 会阻止在您重做搜索时返回缓存响应 @ExploZe 听起来比刷新单个分片要贵很多,不是吗?由于我的弹性实例的全部目的是加快搜索速度,我担心这可能会对搜索时间产生更大的负面影响。 【参考方案1】:

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

【讨论】:

以上是关于ElasticSearch 文档 refresh=true 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

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

Elasticsearch refresh 和 fresh 特性梳理

Elasticsearch 刷新 配置之index.refresh_interval引发的问题

Elasticsearch 刷新 配置之index.refresh_interval引发的问题

Elasticsearch 刷新 配置之index.refresh_interval引发的问题

Elasticsearch:Elasticsearch中的refresh和flush操作指南