为了加快我们网站上的搜索速度,我创建了一个小型弹性搜索实例,它保留了我们数据库中所有“可搜索”字段的副本。它只包含几百万个文档,每个文档的平均大小约为1KB。目前(正在开发中)我们只有2个节点,但在生产中可能需要更多。
我们的应用程序是一个“主要阅读”应用程序-每天可能更新1000个文档,但它们每天被阅读和搜索10万次。
每个文档代表票务系统中的一个案例,随着用户研究和关闭案例,案例可能会在白天改变状态。如果研究人员关闭了一个案例,然后立即刷新他的开放工作队列,我们期望案例从他们的队列中消失,该队列由对我们的弹性搜索实例的查询驱动,按状态过滤。状态是案例索引中的一个字段。
我们收到的抱怨是,当研究人员关闭一个案例时,在立即刷新他的队列时,当过滤“进行中”的案例时,案例仍然会回来。如果他晚一两秒钟刷新视图,它就消失了。
为了解决这个问题,我在更新文档时添加了刷新=true,例如curl-XPUT'https://my-dev-es-instance.com/cases/_doc/11?refresh=true'-d'{"状态":"关闭",…}'
但问题依然存在。
以下是我从上述请求中得到的响应:
{"_index":"案例","_type":"_doc","_id":"11","_version": 2,"结果":"更新","forced_refresh":true,"_shards":{"总计":2,"成功":1,"失败":0},"_seq_no":70757,"_primary_term":1}
响应似乎验证了收到了forced_refresh请求,尽管它确实说在总共2个分片中,1个成功,0个失败。不确定另一个,但是因为我只有2个节点,这是否意味着它更新了辅助节点?
根据文档:要在操作发生后立即刷新分片(而不是整个索引),以便文档立即出现在搜索结果中,刷新参数可以设置为true。将此选项设置为true应该只有在仔细思考并验证它不会导致性能下降后才能完成,无论是从索引还是搜索的角度来看。请注意,使用getAPI获取文档是完全实时的,不需要刷新。
我的期望合理吗?有更好的方法吗?
经过更多测试,我得出结论,我的问题是由于应用程序逻辑错误,而不是ElasticSearch的问题。刷新标志的行为符合预期。为虚假信息道歉。