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

时间:2017-09-26 20:46:08

标签: elasticsearch solr lucene elastic-stack recommendation-engine

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

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

我们根据使用elasticsearch的算法向客户展示推荐产品列表。 如果客户将产品标记为“不感兴趣”,我们无需再次向他展示该产品。 我们将这些产品保存在一个单独的SQL表中,其中包含 product_id customer_id status 'not_interested'。

现在,在运行时为客户提取建议时,我们从SQL数据库中获取“not_interested”产品列表,并在elasticsearch中的非过滤器中发送 product_ids 数组,以将其排除在外建议。 但是当 product_ids 数组的大小变得太大时,问题就出现了。

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

将它们存储为嵌套对象或父/子文档是否有意义。或者一些完全其他的存储方式,以便我可以有效地从结果中排除一些ID。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

使用" ID"查询:

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

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

包裹在bool中> must_not。

答案 2 :(得分:0)

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

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