我在索引中存储了不同的文档。一些工作人员正在此索引中搜索所需的文档,并将其用于自己的逻辑。问题是我想将找到的文档标记为工作人员使用(或完全删除它们),但是问题是多个工作人员可能会获得相同的文档,因为工作人员同时需要文档。
Elasticsearch可以解决此问题,还是我需要自己实现锁定/同步?例如,如果2名工人要求最新的20个文档,我需要某种方式为每个工人返回不同的20个文档。
答案 0 :(得分:2)
Elasticsearch在optimistic locking支持下提供了更新操作。因此,您可以进行搜索并获取文档列表,然后针对每个文档尝试将其锁定。根据Elasticsearch版本的不同,需要传递给更新API的确切参数会有所不同,
您可以使用locked: true
之类的附加属性,该属性将允许工作人员在进行初始搜索时忽略锁定的文档。更新是成功还是失败取决于它是否同时被其他工作人员锁定。如果失败,则忽略这些文档。
此方法的效果取决于工人的数量以及他们试图锁定同一文档时可能发生的争执。归根结底,Elasticsearch并不是一个排队系统,可能无法针对此类用例进行优化。
您可能还对Percolate Query感兴趣,这可以逆转条件。您的工作人员可以注册一组查询,然后在对文档建立索引时,只需发出渗滤查询,查看该文档是否与任何已注册的查询匹配,然后将其推送到工作人员队列即可,而不是搜索与特定查询匹配的文档。通过这种方法,Elasticsearch仅用于搜索。整个工人的工作分配将由工人队列处理。