我有一堆商店,每个商店都出售几种产品,并且这些产品都有说明。我想建立一种搜索体验,使用户可以按描述中的单词搜索产品,并有一个搜索结果页面,其中显示匹配的产品,并按出售它们的商店进行分组。我的问题是:
如何设计一种高效的Elasticsearch模式和查询方案,使我可以查询按商店分组结果的产品,并确保搜索结果中的每个商店都包含与查询匹配的商品的完整列表? / p>
例如,假设我有以下数据:
在我的整个应用程序中,我希望查询“三明治”以返回如下内容:
每当我显示一家商店时,我总是希望显示该商店的所有匹配。在我工作的领域中,有很多商店,但是每个商店只有少量产品(最多约10-20个,大多数商店只有2或3个)。
我可以看到两种方法来实现此目标,这两种方法对我来说都是不好的。
为每个产品建立索引是一个单独的文档。然后在查询时,我可以获取每个匹配的文档,并在Java中对其进行后期处理,以按存储对它们进行分组,最后返回该结果。我看到的这种方法的问题是:
将每个商店的索引都作为一个单独的文档,并带有一个嵌套字段来保存每个产品。在查询时,我可以检索产品描述嵌套字段与搜索词匹配的商店。然后,一旦有了要显示的商店,就必须运行一个单独的查询以从这些商店中获取匹配的产品。这种方法的问题是:
除了我之外,对Elasticsearch更有经验的人可以找到更好的选择吗?
答案 0 :(得分:1)
使用方法2,我看到2个选项:
您可以使用top_hits with reverse_nested aggregator。您将搜索查询中的产品,并将文档按存储在聚合器中分组。 top_hits聚合返回常规搜索结果,这意味着您将获得子项(产品)以及父项(商店)。