当前位置: 首页 > 知识库问答 >
问题:

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

印季
2023-03-14

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

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

我们基于使用ElasticSearch的一些算法向客户显示推荐产品的列表。如果一个顾客把一个产品标记为‘不感兴趣',我们就不必再给他看那个产品了。我们将这些产品保存在一个单独的SQL表中,表中有product_id、customer_id,状态为'not_interesting'。

现在,当在运行时为客户获取推荐时,我们从SQL数据库中获取“not_interested”产品的列表,并在elasticsearch中的not筛选器中发送Product_ID数组,以将它们从推荐中排除。但是问题出现了,当product_ids数组的大小变得太大时。

我应该如何在elasticsearch中存储product_id和customer_id映射,以便在运行时仅使用elasticsearch筛选出“not_interested”产品?

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

共有1个答案

邹英悟
2023-03-14

您可以使用术语查询有效地排除ID(或任何其他文字字符串)。

Elasticsearch和Solr都有这个功能。它是非常强大和非常高效的。

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

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

 类似资料:
  • 我想从ElasticSearch的结果文档中排除一个字段。我浏览了ElasticSearch.org的这个文档http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-fields.html但当我尝试时,这不起作用。我在SO上看到了同样的问题。有没有办法在Elasticsearch查询中

  • 问题内容: 我需要返回不包含具有特定ID的文档的结果。Elasticsearch允许我们指定允许使用哪些ID,但是我看不到任何禁止某些ID的方法。在我的情况下,我不想返回用户已经看到的内容,因此每个用户的列表都不同。 问题答案: 您可以通过添加一个过滤器来实现此目的,该过滤器包含一个过滤器,该过滤器带有您不想显示的ID数组,如下所示:

  • 问题内容: 我正在开发类似于Tinder的应用程序。在ElasticSearch中,我收集了大约50万用户及其位置。每当用户打开应用程序以搜索附近的用户时,我都会对该集合运行Elastic Search查询。查询是相当复杂的,它不仅考虑位置,而且考虑用户的活跃程度或他拥有多少张照片。 我所苦恼的是如何从查询中排除当前用户已经刷过的那些用户。一种简单的实现方式可能是将嵌套的用户ID数组作为索引中每个

  • 问题内容: 我如何执行搜索,排除字段具有特定值的结果? 我有一个Reddit评论数据库,我想找到提及比特币的信息,但不包括bitcoin subreddit。 错误很长,无法在此处发布。https://gist.github.com/kylelk/feca416156712eebad3e 问题答案: 这是愚蠢的错误, 您必须在query中包含过滤查询。这是修改 希望这可以帮助!!

  • 我有以下elasticsearch索引结构: 其思想是为每个用户id-message\u id插入带有操作“open”的记录,该用户id-message\u id缺少带有操作“open”的记录。为此,我需要获取所有user\u id-message\u id关联,前提是它们没有动作:“open”。 是否可以创建一个查询,返回不同的user_id-message_id记录不包括user_id-mes

  • 我已经在按\u score desc排序的查询部分中获得了所需的查询结果。现在我需要提取每个文档的3个字段。我想实现如下目标: 我刚刚试过: 1)使用折叠删除重复的值 但问题是它只会保留filed1的不同值,而忽略field 2和field 3的值。例如,我们有2条记录,如下所示: 使用此方法,我们只能获得一条记录,因为它们具有相同的field1值。我想要这三个字段的不同组合值。我们可以使用int