我在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。
答案 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)