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 的问题。刷新标志的行为符合预期。为错误信息道歉。
为了加快我们网站上的搜索速度,我创建了一个小型弹性搜索实例,它保留了我们数据库中所有“可搜索”字段的副本。它仅包含几百万个文档,每个文档的平均大小约为 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 的问题。刷新标志的行为符合预期。为错误信息道歉。