用于检索与另一个值关联的值数组的ElasticSearch聚合,

wljmcqd8  于 2022-11-28  发布在  ElasticSearch
关注(0)|答案(1)|浏览(138)

我正在使用一个Elasticsearch索引,其中的数据如下:

"_source": {
    "article_number": "123456",
    "title": "Example item #1",
    "attributes": [
        {
            "key": "Type",
            "value": "Bag"
        },
        {
            "key": "Color",
            "value": "Grey"
        }
    ]
},

"_source": {
    "article_number": "654321",
    "title": "Example item #2",
    "attributes": [
        {
            "key": "Type",
            "value": "Bag"
        },
        {
            "key": "Color",
            "value": "Red"
        }
    ]
}

我们的目标是在一个页面中动态生成搜索输入,其中每个attributes.key的唯一值都有一个搜索输入,并且在该输入中,每个attributes.value的对应值都有一个值。因此,在本例中,我希望呈现一个“Type”输入,它只提供值“Bag”,而“Color”输入提供值“Grey”和“Red”。
我试图通过一个聚合来实现这一点,这个聚合将给予我一个唯一的attributes.key的所有值的集合沿着一个与每个键相关联的attributes.value的所有值的数组。

{
    [
        {
            "key": "Type",
            "values": [{
                "name": "Bag",
                "doc_count": 2
            }]
        },
        {
            "key": "Color",
            "values": [{
                "name": "Grey",
                "doc_count": 1
            },
            {
                "name": "Red",
                "doc_count": 1
            }]
        }
}

我已经尝试了嵌套和反向嵌套聚合,以及复合聚合,但到目前为止还没有成功。

tktrz96b

tktrz96b1#

假设您的索引Map如下所示:

PUT attrs
{
  "mappings": {
    "properties": {
      "attributes": {
        "type": "nested",
        "properties": {
          "key": {
            "type": "keyword"
          },
          "value": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

您可以使用nestedterms aggregation及其子聚合的以下组合来获得所需的结果:

POST attrs/_search
{
  "size": 0,
  "aggs": {
    "nested_context": {
      "nested": {
        "path": "attributes"
      },
      "aggs": {
        "by_keys": {
          "terms": {
            "field": "attributes.key",
            "size": 10
          },
          "aggs": {
            "by_values": {
              "terms": {
                "field": "attributes.value",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

相关问题