【发布时间】: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