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

问题描述:

我有很多产品索引在elasticsearch。我需要从elasticsearch中的查询中排除一个id列表(我从SQL数据库中提取)。 假设产品存储为,如何从elasticsearch结果中排除大量的id?

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

我们展示推荐产品的列表,基于使用elasticsearch一些算法客户。 如果客户将产品标记为“不感兴趣”,我们不必再向他显示该产品。 我们保持这样的产品在一个单独的SQL表PRODUCT_IDCUSTOMER_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/

+0

如果被否定的ID列表是一个巨大的列表,请问这不成问题吗?比方说数以万计的这种文件ID。 –

+0

如果您执行此服务器端,则不会出现问题,因为此查询针对您的用例进行了优化。我已经做了好几万次,而且速度还是很快的!要看它什么时候变慢,你必须测试这个,因为这取决于你的索引大小,但这将是一个非常高的数字。 – drjz

+0

@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中完成。 –

must_not部分添加Terms类似如下:

​​

使用 “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。