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

Filtering by priority based on a document's key in Elasticsearch

我有一个很大的 ES 索引,我打算使用各种来源来填充它。来源有时有相同的文档,这意味着我将有重复的文档,仅 'source' 参数不同。

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

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

我不想在 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:

As you have seen in this blog post, it is possible to prevent duplicates in Elasticsearch by specifying a document identifier externally prior to indexing data into Elasticsearch. The type and structure of the identifier can have a significant impact on indexing performance. This will however vary from use case to use case so it is recommended to benchmark to identify what is optimal for you and your particular scenario.