如何从elasticsearch结果中排除大量的id?
我有很多产品索引在elasticsearch。我需要从elasticsearch中的查询中排除一个id列表(我从SQL数据库中提取)。 假设产品存储为,如何从elasticsearch结果中排除大量的id?
{
"id" : "1",
"name" : "shirt",
"size" : "xl"
}
我们展示推荐产品的列表,基于使用elasticsearch一些算法客户。 如果客户将产品标记为“不感兴趣”,我们不必再向他显示该产品。 我们保持这样的产品在一个单独的SQL表PRODUCT_ID,CUSTOMER_ID和状态 'not_interested'。
现在,而在运行时客户获取建议,我们得到的“not_interested”从SQL数据库产品列表,并发送product_ids阵列中的未过滤器elasticsearch从建议中排除。 但问题出现,当数组的大小变得太大时,product_ids。
我应该如何在elasticsearch 中存储product_id和customer_id映射以仅在运行时使用elasticsearch过滤出'not_interested'产品?
将它们作为嵌套对象或父/子文档存储是否合理?或者有些完全的其他存储方式,以便我可以有效地从结果中排除一些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
(如fq=-{!terms f=id}doc334,doc125,doc777,doc321,doc253
)内使用terms query
。注意减号表示它是否定。请参阅:http://yonik.com/solr-terms-query/
使用 “IDS” 查询:
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。
如果被否定的ID列表是一个巨大的列表,请问这不成问题吗?比方说数以万计的这种文件ID。 –
如果您执行此服务器端,则不会出现问题,因为此查询针对您的用例进行了优化。我已经做了好几万次,而且速度还是很快的!要看它什么时候变慢,你必须测试这个,因为这取决于你的索引大小,但这将是一个非常高的数字。 – drjz
@drjz弹性搜索的实现在这里有详细记录https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html。我可以在Solr也有类似的东西吗?如果docIds很大,_fq = - {!terms f = id} doc334,doc125,doc777,doc321,doc253_将达到查询长度限制。有没有其他方法可以在Solr中实现这一点,方法已经在ES中完成。 –