根据Elasticsearch中文档的键按优先级过滤

时间:2019-09-24 09:18:53

标签: elasticsearch elasticsearch-py

我有一个很大的ES索引,打算使用各种来源进行填充。有时,源代码具有相同的文档,这意味着我将拥有重复的文档,只是“源代码”参数有所不同。

要在提供搜索服务时执行重复数据删除,我看到两种方法:

  1. 让Elasticsearch执行优先级过滤。
  2. 获取所有内容并通过Python进行过滤

我不想在Python级别进行过滤以保留分页,所以我想问问是否有一种方法可以告诉Elasticsearch根据文档中的某个值(在我的情况下为源)进行优先级过滤。

我想按简单的优先级进行过滤(因此,如果我的订单是A,B,C,则我将在A文档存在的情况下提供服务,如果源A的文档不存在则提供B服务,然后是C)。 / p>

一组重复文档的示例如下:

{
"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,愿意探索这一点。

1 个答案:

答案 0 :(得分:0)

我认为最好的解决方案是实际上避免索引中出现重复项。我不知道您数据中的频率如何,但是如果您有很多数据,这将严重影响术语频率,并可能导致搜索相关性较差。

一种非常简单的方法可以是生成文档的ElasticSearch ID,并在所有来源之间使用一致的方法。您确实可以在建立索引时强制_id而不是让ES为您生成它。

然后将发生的是,最后一个来源将覆盖现有的(如果存在的话)。最后的胜利。如果您不关心source,这可能会起作用。

但是,这会带来一些性能上的损失,例如stated in this article

  

正如您在此博客文章中所看到的,可以通过在将数据索引到Elasticsearch之前在外部指定文档标识符来防止Elasticsearch中的重复。标识符的类型和结构可能对索引性能产生重大影响。但是,这会因使用案例而异,因此建议进行基准测试,以确定最适合您和您的特定方案的情况。