elasticsearch 撰写巢状汇总

kcrjzv8t  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(162)

我为任何英语错误感到抱歉。
我希望有人能帮助我。
假设我有下面的Map到我的索引:

PUT test-index
{
  "mappings": {
    "properties": {
      "nestedOBJField": {
        "type": "nested",
        "index": true
      },
       "keywordField": {
        "type": "keyword",
        "index": true
      }
    }
  }
}

是否可以将复合功能与嵌套字段一起使用?
如果我能做这样的事情,那将是非常困难的:

GET /test-index/_search
{
  "size": 0, 
  "aggs": {
    "TestAgg": {
      "composite": {
        "size": 10000,
        "sources": [
          {
            "keyWordFieldAgg": {
              "terms": {
                "field": "keyWordField"
              }
            },
           {
            "nestedFieldAgg": {
              "terms": {
                "field": "nestedOBJField.attribute"
              }
            }
          }
        ]
      }
    }
  }
}

但是这种方法会返回一些错误。
如果有人能帮上忙,我将不胜感激

abithluo

abithluo1#

属性nestedOBJField的数据类型为“nested”,属性keyWordField为关键字类型,并且与nestedOBJField处于同一级别。
要在聚合中使用嵌套字段,您需要使用nested aggregation,但是复合聚合中的所有源必须是嵌套类型。
您可以使用以下解决方法。
1.将keyWordField移动到文档中嵌套对象内

{
  "mappings": {
    "properties": {
      "nestedOBJField": {
        "type": "nested",        
        "properties":{
              "keywordField": {
              "type": "keyword"
             }
         }
      }       
    }
  }
}

示例文档

{
    "nestedOBJField":[
      {
          "attribute":"1",
          "age":1,
           "keywordField":"xyz"
      },
      {
          "attribute":"2",
          "age":2,
           "keywordField":"xyz"
      }
    ]
}

查询

"aggs": {
    "TestAgg": {
      "nested": {
        "path": "nestedOBJField"
      },
      "aggs": {
        "name": {
          "composite": {
            "size": 10000,
            "sources": [
              {
                "nestedFieldAgg": {
                  "terms": {
                    "field": "nestedOBJField.attribute.keyword"
                  }
                }
              },
              {
                "a":{
                  "terms": {
                    "field": "nestedOBJField.keywordField.keyword"
                  }
                }
              }
            ]
          }
        }
      }
    }
  }

将字段移动到嵌套属性内将意味着数据重复,即更新所有嵌套文档中数据
1.使用术语聚合-在这种情况下,分页将是一个问题

{
  "size": 0,
  "aggs": {
    "TestAgg": {
      "nested": {
        "path": "nestedOBJField"
      },
      "aggs": {
        "name": {
          "terms": {
            "field": "nestedOBJField.attribute.keyword",
            "size": 10
          },
          "aggs": {
            "back_to_parent": {
              "reverse_nested": {},
              "aggs": {
                "keywords": {
                  "terms": {
                    "field": "keywordField.keyword",
                    "size": 10
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

相关问题