如何在弹性搜索中查询嵌套的json对象/字段?

问题描述 投票:1回答:1

我正在基于如下所示的字段[recommendationType]进行术语聚合,但是elastic仅返回1个术语计数而不是2个术语,它没有进行嵌套的对象聚合,即在events.ecommerceData.comments [是一个列表]下,我有2个RecommendationType。请纠正我在哪里做错了。

{
    "aggs": {
        "genres": {
            "terms": {
                "field": "events.ecommerceData.comments.recommendationType"
            }
        }
    }
}

这是我的原始文件

{
  "clusterId": "1",
  "rank": 1,
  "events": [{
    "eventId": "1",
    "eventType": "Delayed",
    "metaInfo": {
      "batch_id": "batch_1"
    },
    "recommendationData": [{
      "exceptionId": "2",
      "item": "Item1",
      "location": "DC1",
      "dueDate": "2019-01-10T05:30:00.000+0530",
      "quantity": 100,
      "metaInfo": {
        "batch_id": "batch_1",
        "dummy_id": "dummy_1"
      },
      "rank": 1,
      "recommendations": [{
        "rank": 1,
        "recommendationType": "transfer",
        "customerName": "Walmart",
        "stockTransfer": {
          "primaryRecommendation": true,
          "priority": 1,
          "sourceLocation": "DC3",
          "metaInfo": 40,
          "shipDate": "2019-01-09T05:30:00.000+0530",
          "arrivalDate": "2019-01-10T05:30:00.000+0530",
          "transportMode": "Road",
          "transferCost": 200.0,
          "maxQtyAvailableForTransfer": 40,
          "totalQtyAtSource": 40
        },
        "expedite": null
      }, {
        "rank": 1,
        "recommendationType": "transfer",
        "customerName": "Walmart",
        "stockTransfer": {
          "primaryRecommendation": true,
          "priority": 2,
          "sourceLocation": "DC2",
          "transferQuantity": 60,
          "shipDate": "2019-01-09T05:30:00.000+0530",
          "arrivalDate": "2019-01-10T05:30:00.000+0530",
          "transportMode": "Road",
          "transferCost": 600.0,
          "maxQtyAvailableForTransfer": 100,
          "totalQtyAtSource": 100
        },
        "expedite": null
      }]
    }]
  }]
}
java elasticsearch kibana elastic-stack elasticsearch-5
1个回答
1
投票

必须使用nested字段类型:

PUT events
{
  "mappings": {
    "properties": {
      "events": {
        "type": "nested",
        "properties": {
          "ecommerceData": {
            "type": "nested",
            "properties": {
              "comments": {
                "type": "nested",
                "properties": {
                  "recommendationType": {
                    "type": "keyword"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

POST events/_doc
{
  "events": [
    {
      "eventId": "1",
      "ecommerceData": [
        {
          "comments": [
            {
              "rank": 1,
              "recommendationType": "abc"
            },
            {
              "rank": 1,
              "recommendationType": "abc"
            }
          ]
        }
      ]
    }
  ]
}

GET events/_search
{
  "size": 0,
  "aggs": {
    "genres": {
      "nested": {
        "path": "events.ecommerceData.comments"
      },
      "aggs": {
        "nested_comments_recomms": {
          "terms": {
            "field": "events.ecommerceData.comments.recommendationType"
          }
        }
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.