如何汇总结果并在某些字段上创建数组

时间:2019-04-08 16:04:55

标签: elasticsearch

我是Elasticsearch的新手,不确定从哪里开始。

这是我在ES中的数据:

[{
  product_id: "xxxyyyxx",
  shop_id: "shop1",
  name: "Elastic testing",
  creator: "Test 1337",
  price: 13
},
{
  product_id: "xxxyyyxx",
  shop_id: "shop2",
  name: "Elastic testing",
  creator: "Test 1337",
  price: 10
}]

我想要得到的东西

{
  product_id: "xxxyyyxx",
  shops: ['shop1', 'shop2'],
  name: "Elastic testing",
  creator: "Test 1337",
  min_price: 10,
  max_price: 13
}

这是我到目前为止的内容,它只返回结果而不进行汇总...

query: {
  multi_match: {
    query: 'test',
    fields: ['creator', 'name', 'info']
  }
}

如果您能为我指明正确的起点,将不胜感激。

2 个答案:

答案 0 :(得分:2)

看看aggregations。 有一个将您的数据分组为buckets的聚合,您可以在该存储桶上使用这些聚合来计算metrics。指标的一个示例是您需要最低和最高价格。您可以嵌套聚合,以获得所需的结果。

聚合是在查询之外定义的,查询的匹配项用作输入数据。

在您的用例中,您可以在名称字段上使用术语聚合,这将为您提供每个名称的存储桶。如果您随后在此存储分区中使用最大值和最小值的指标,则说明您已经拥有了所需结果的一部分。

关于shopIds,您将需要嵌套另一个存储桶聚合,这将为fiels shopId中包含该值的所有文档的每个单个值提供一个存储桶。

示例:

"query": { //your query here ...},
    "aggs" : {
        "name_term" : {
            "terms" : { "field" : "name" },
            "aggs" : {
                "max_price" : { "max" : { "field" : "price" } },
                "min_price" : { "min" : { "field" : "price" } },
                "shops" : {
                    "terms" : { "field" : "shop_id" }
                }
            } 
        }
    }

答案 1 :(得分:0)

创建ID数组的声明与声明普通字段的声明相同:

"product_id": {
    "type": "keyword",
    "store": "true",
    "index": "true"
}

只需确保在您的类中将数组命名为product_id即可:

List<String> product_id