我有一个ElasticSearch索引,用于存储产品 - 就像在线商店一样。现在我想在我的商店中介绍产品变体,但我无法更改索引以使用一些嵌套或父/子数据类型,因为还有很多其他工具已经使用了这个索引(我不想调整这些工具也)。我们只能添加一些额外的字段。 - >我无法在索引时间内将索引和组变体重建为逻辑组。
在查询时间内获取此类项目组的最佳选择是什么? 另一个问题是:很多产品都是非变体的,因此我的查询结果必须返回变体(分组)和非变体单独项目的混合 - 它们必须全部按_score排序。 可能的选择:如果我们没有获得变体组的所有项目,但只获得每个变体组的最佳结果,则可以。但我们必须确保,我们不会将变体组的项目作为单独的搜索结果。
也许我们可以通过多个查询实现它 - 比如首先在variant_id上进行一些聚合,然后再获得所有项目的另一个查询
实施例: 以下行被编入索引:
{"title": "Samsung TV xxx"}
{"title": "Philips TV yyy"}
{"title": "Nike shoe MyRun", "size": 40, "variant_group": 5}
{"title": "Nike shoe MyRun", "size": 42, "variant_group": 5}
{"title": "Adidas shoe YourRun", "size": 39, "variant_group": 10}
{"title": "Adidas shoe YourRun", "size": 40, "variant_group": 10}
{"title": "Adidas shoe YourRun", "size": 46, "variant_group": 10}
{"title": "Dictionary book"}
我的查询与所有这些项匹配,应返回以下文档:
{"title": "Samsung TV xxx"}
{"title": "Philips TV yyy"}
[
{"title": "Nike shoe MyRun", "size": 40, "variant_group": 5}
{"title": "Nike shoe MyRun", "size": 42, "variant_group": 5}
]
[
{"title": "Adidas shoe YourRun", "size": 39, "variant_group": 10}
{"title": "Adidas shoe YourRun", "size": 40, "variant_group": 10}
{"title": "Adidas shoe YourRun", "size": 46, "variant_group": 10}
{"title": "Dictionary book"}
]
{"title": "Dictionary book"}
OR(每个变体组的最佳结果):
{"title": "Samsung TV xxx"}
{"title": "Philips TV yyy"}
{"title": "Nike shoe MyRun", "size": 40, "variant_group": 5}
{"title": "Adidas shoe YourRun", "size": 39, "variant_group": 10}
{"title": "Dictionary book"}
答案 0 :(得分:0)
您可以将top hits sub-aggregation与术语汇总结合使用:
curl -XGET 'localhost:9200/your_index/products/_search&pretty' -H 'Content-Type: application/json' -d'
{
@@@ your filters here @@@
"size": 0,
"aggs": {
"variant_groups": {
"terms": {
"field": "variant_group",
"size": 20,
"missing": "No group",
},
"aggs": {
"products_hits": {
"top_hits": {
"size" : 1
}
}
}
}
}
}
'
根据每个variant_group的过滤器返回顶级产品。
目前仅基于频率的前20个组,但可以使用术语聚合的order
和size
参数更改顺序和大小。如果需要,可以使用较大的值。
missing
参数定义应如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。
结果将位于Elasticsearch响应的aggregation
部分,而不是hits
,我们在查询的根目录中使用size: 0
留空。