ElasticSearch中的嵌套直方图查询

时间:2016-06-24 16:10:40

标签: elasticsearch

我有以下一套documnets
有没有什么办法可以在弹性搜索中进行嵌套直方图搜索

{"id": 1, "regions" : 111, "category" : 6, "Price" : 957}
{"id": 2, "regions" : 111, "category" : 6, "Price" : 829}
{"id": 3, "regions" : 111, "category" : 7, "Price" : 123}
{"id": 4, "regions" : 111, "category" : 7, "Price" : 129}
{"id": 5, "regions" : 111, "category" : 8, "Price" : 351}
{"id": 6, "regions" : 111, "category" : 8, "Price" : 225}

{"id": 7, "regions" : 112, "category" : 6, "Price" : 625}
{"id": 8, "regions" : 112, "category" : 6, "Price" : 599}
{"id": 9, "regions" : 112, "category" : 7, "Price" : 256}
{"id": 10, "regions" : 112, "category" : 7, "Price" : 129}
{"id": 11, "regions" : 112, "category" : 8, "Price" : 333}
{"id": 12, "regions" : 112, "category" : 8, "Price" : 444}
{"id": 13, "regions" : 112, "category" : 9, "Price" : 199}
{"id": 14, "regions" : 112, "category" : 9, "Price" : 149}
{"id": 15, "regions" : 112, "category" : 5, "Price" : 299}
{"id": 16, "regions" : 112, "category" : 5, "Price" : 349}

我需要进行查询(可能是一些嵌套的直方图或其他)以获得以下格式的输出
每个地区都应该有最低价格的独特类别。

[{
        "regions" : 111,
        [{
                "category" : 6,
                "Price" : 829
            }, {
                "category" : 7,
                "Price" : 123
            }, {
                "category" : 8,
                "Price" : 225
            }
        ]
    }, {
        "regions" : 112,
        [{
                "category" : 6,
                "Price" : 599
            }, {
                "category" : 7,
                "Price" : 129
            }, {
                "category" : 8,
                "Price" : 333
            }, {
                "category" : 9,
                "Price" : 149
            }, {
                "category" : 5,
                "Price" : 299
            }
        ]
    },
]

提前谢谢

2 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow。 ElasticSearch不会以您指定的格式精确地吐出数据。您需要使用查询来过滤您正在寻找的结果,然后遍历每个结果,将您想要的数据放入您想要的结构中。

答案 1 :(得分:0)

您可以使用_bulk API对数据编制索引。像这样:

$ curl -XPOST localhost:9200/my_index/data/_bulk -d '{"index":{"_id":"1"}}
{"regions" : 111, "category" : 6, "Price" : 957}
{"index":{"_id":"2"}}
{"regions" : 111, "category" : 6, "Price" : 829}
{"index":{"_id":"3"}}
{"regions" : 111, "category" : 7, "Price" : 123}
{"index":{"_id":"4"}}
{"regions" : 111, "category" : 7, "Price" : 129}
{"index":{"_id":"5"}}
{"regions" : 111, "category" : 8, "Price" : 351}
{"index":{"_id":"6"}}
{"regions" : 111, "category" : 8, "Price" : 225}
'

空行对于_bulk端点很重要,所以我使用它的方式非常有意。

然后,您将拥有一个映射为regionscategoryPrice索引为long值的索引。从那里,您可以使用聚合来获取您要求的直方图:

$ curl -XGET localhost:9200/my_index/_search -d '{
  "aggs": {
    "group_by_region": {
      "terms": {
        "field": "regions",
        "size": 10
      },
      "aggs": {
        "group_by_category": {
          "terms": {
            "field": "category",
            "size": 10
          },
          "min_price": {
            "min": {
              "field": "Price"
            }
          }
        }
      }
    }
  }
}'

这不会像你真正提出的那样给出输出,但它会为你提供你正在寻找的价值。注意:我选择了任意尺寸。此外,名称如" group_by_region"取决于你;他们会在回复中看到一些东西,名字完全是任意的。