ElasticSearch:仅返回逻辑组的第一个结果

时间:2017-09-27 15:45:49

标签: elasticsearch

我有一个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"}

1 个答案:

答案 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个组,但可以使用术语聚合的ordersize参数更改顺序和大小。如果需要,可以使用较大的值。

missing参数定义应如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。

结果将位于Elasticsearch响应的aggregation部分,而不是hits,我们在查询的根目录中使用size: 0留空。