我有一个很大的ES索引,打算使用各种来源进行填充。来源有时具有相同的文档,这意味着我将拥有重复的文档,只是“来源”参数有所不同。
要在提供搜索服务时执行重复数据删除,我看到了两种方法:
我不想在Python级别进行过滤以保留分页,所以我想问问是否有一种方法可以告诉Elasticsearch基于文档中某些值的优先级过滤器(在我的情况下是源代码)。
我想按简单优先级进行过滤(因此,如果我的订单是A,B,C,则我将在A文档(如果存在)的情况下提供服务,然后在源A的文档不存在的情况下提供B,然后是C)。
一组重复文档的示例如下所示:
{
"id": 1,
"source": "A",
"rest_of": "data",
...
},
{
"id": 1,
"source": "B",
"rest_of": "data",
...
},
{
"id": 1,
"source": "C",
"rest_of": "data",
...
}
但是,如果我想先投放“A”,然后如果没有“A”,则投放“B”,如果没有“B”,然后投放“C”,则搜索“id”的结果:1看起来像:
{
"id": 1,
"source": "A",
"rest_of": "data",
...
}
注意:
另外,我可以尝试在总体阶段进行重复数据删除,但是我担心性能。如果没有简单的方法来实现解决方案1,愿意探索这一点。
最佳答案
我认为最好的解决方案是实际上避免索引中出现重复项。我不知道您数据中的频率如何,但是如果您有很多数据,这将严重影响术语频率,并可能导致搜索相关性较差。
一种非常简单的方法可以是生成文档的ElasticSearch ID,并在所有源上使用一致的方法。您确实可以在建立索引时强制_id
,而不是让ES为您生成它。
然后将发生的是,最后一个源将覆盖现有的源(如果存在)。最后的胜利。如果您不关心source
,这可能会起作用。
但是,这会带来一些性能损失,例如stated in this article:
关于elasticsearch - 根据Elasticsearch中文档的键按优先级过滤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58076973/