如何从 elasticsearch 结果中排除大量 id?

How to exclude a large set of of ids from elasticsearch result?

我在 elasticsearch 中索引了很多 产品。我需要从 elasticsearch 中的查询中排除一个 ID 列表(我从 SQL 数据库中获取)。 假设 Products 存储为,

{
  "id" : "1",
  "name" : "shirt",
  "size" : "xl"
}

我们使用 elasticsearch 根据某种算法向客户显示推荐产品列表。 如果客户将产品标记为 'Not Interested',我们不必再次向他展示该产品。 我们将此类产品与 product_idcustomer_id 和 SQL table 以及状态'not_interested'。

现在,在运行时为客户获取推荐时,我们从 SQL 数据库中获取 'not_interested' 产品列表,并发送 product_id 的数组s 在 elasticsearch 的非过滤器中,将它们排除在推荐之外。 但是问题出现了,当 product_ids 数组的大小变得太大时。

我应该如何在 elasticsearch 中存储 product_id 和 customer_id 映射 仅使用 elasticsearch 在运行时过滤掉 'not_interested' 产品?

将它们存储为嵌套对象或 parent/child 文档是否有意义?或者一些完全不同的存储方式,这样我就可以有效地从结果中排除一些 ID。

您可以使用 terms query 有效地排除 ID(或任何其他文字字符串)。

Elasticsearch 和Solr 都有这个。它非常强大而且非常高效。

Elasticsearch 在 IDS query 中有此功能。该查询实际上是对 _uid 字段的术语查询。确保在 bool 查询的 mustNot 子句中使用此查询。参见:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html

在 Solr 中,您可以在 fq 中使用 terms query,例如 fq=-{!terms f=id}doc334,doc125,doc777,doc321,doc253。注意减号表示它是一个否定。参见:http://yonik.com/solr-terms-query/

添加 Terms under must_not 部分,如下所示:

{
  "must_not": [
    {
      "terms": {
        "id": [
          "1",
          "3",
          "5"
        ]
      }
    }
  ]
}

使用"ids"查询:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html

{
    "query": {
        "ids" : {
            "type" : "my_type",
            "values" : ["1", "4", "100"]
        }
    }
}

包裹在布尔值内> must_not。