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

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

  • 获取Elasticsearch以执行优先级过滤。
  • 获取所有内容并通过Python过滤

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

    10-11 22:40
    查看更多