【问题标题】:In Elasticsearch, how can I retrieve products grouped by the store that sells them?在 Elasticsearch 中,我如何检索按销售商店分组的产品?
【发布时间】:2020-10-31 13:07:02
【问题描述】:

我有很多商店,每个商店都销售几种产品,并且这些产品都有描述。我想建立一种搜索体验,用户可以通过描述中的单词搜索产品,并有一个搜索结果页面,其中显示匹配的产品,按销售它们的商店分组。我的问题是:

如何设计一个高效的 Elasticsearch 架构和查询方案,让我可以查询产品,结果按商店分组,并保证搜索结果中的每个商店都包含与查询匹配的完整商品列表?


例如,假设我有以下数据:

  • 商店 1
    • 产品 1a,描述:“花生酱果冻三明治”
    • 产品 1b,描述:“Taco”
    • 产品 1c,描述:“三明治架”
  • 商店 2
    • 产品 2a,描述:“墨西哥卷饼碗”
  • 商店 3
    • 产品 3a,描述:“三明治机”
    • 产品 3b,描述:“三明治面包”
    • 产品 3c,描述:“沙拉钳”

在我的整个应用程序中,我希望对“三明治”的查询返回如下内容:

  • 商店 1
    • 产品 1a
    • 产品 1c
  • 商店 3
    • 产品 3a
    • 产品 3b

每当我展示一家商店时,我总是希望展示该商店的所有点击量。在我工作的领域,有很多商店,但每家商店只有少量产品(最多大约 10-20 个,大多数商店只有 2 或 3 个)。

我可以看到两种实现方式,但对我来说都不好。

方法#1

索引每个产品都是一个单独的文档。然后在查询时,我可以获取每个匹配的文档并在 Java 中对它们进行后处理,以按商店对它们进行分组,最后返回该结果。我看到这种方法的问题是:

  • 我不能使用任何排名,因为我要对结果重新排序。
  • 我也不能做任何限制;我必须获取每一个文档,无论有多少,否则我不能保证我拥有特定商店的所有产品。这将导致大量工作浪费。

方法#2

将每个商店索引为一个单独的文档,其中包含一个包含每个产品的嵌套字段。在查询时,我可以检索产品描述嵌套字段与搜索词匹配的商店。然后,一旦我有了想要展示的商店,我就必须运行一个单独的查询来从这些商店中获取匹配的产品。这种方法的问题是:

  • 我要求 elasticsearch 做更多不必要的工作;在内部,它在第一个查询中找到了我需要的所有内容,但我还是在问第二个查询
  • 发出两个相关查询会使代码复杂化,并要求我保持两个查询同步(例如,我需要确保在查询 1 中作为子字段匹配的文档与查询 2 匹配的文档相同)

谁能比我更有经验的 Elasticsearch 找到更好的选择?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    使用方法#2,我看到了 2 个选项:

    1. Nested inner hits.

    2. 您可以使用top_hits with reverse_nested aggregator。您将在查询中搜索产品,并将按存储在聚合器中对文档进行分组。 top_hits 聚合返回常规搜索命中,这意味着您将获得子项(产品)以及父项(商店)。

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多