计算ElasticSearch中具有两个特定值的文档中出现的嵌套字段值的数量

62lalag4  于 2023-01-16  发布在  ElasticSearch
关注(0)|答案(1)|浏览(123)

我在ElasticSearch数据库中有一些文档,看起来像这样:
文件一:

{
    “Id”: 6000,
    “customerName”: GT, 
    “pages”: [
    {
    “fieldType”: typeA,
    “fieldId”: 1001
    }
    {
    “fieldType”: typeB,
    “fieldId”: 1002
    }
]
}

文件二:

{
    “Id”: 6001,
    “customerName”: MX, 
    “pages”: [
    {
    “fieldType”: typeA,
    “fieldId”: 1001
    }
    
]
}

文件三:

{
    “Id”: 6002,
    “customerName”: MX, 
    “pages”: [
    {
    “fieldType”: typeB,
    “fieldId”: 1002
    }
    {
    “fieldType”: typeC,
    “fieldId”: 1003
    }
]
}

文件四:

{
    “Id”: 6003,
    “customerName”: GT, 
    “pages”: [
    {
    “fieldType”: typeA,
    “fieldId”: 1005
    }
    {
    “fieldType”: typeC,
    “fieldId”: 1003
    }
]
}

文件五:

{
    “Id”: 6004,
    “customerName”: MX, 
    “pages”: [
    {
    “fieldType”: typeA,
    “fieldId”: 1005
    }
]
}

我需要计算嵌套在“pages”字段中的typeA条目的数量,但只计算同时出现在两个文档中的条目-customerName为GT和MX的条目。基本上,我想知道在customerName=GT和customerName=MX的文档之间共享typeA的次数。
因此,这意味着我将计算2个typeA条目-一个fieldId为1001的条目位于文档1和文档2中,另一个fieldId为1005的条目位于文档4和文档5中。如何使用DSL查询来实现这一点?
到目前为止,我尝试了这个返回的结果,计数无论是燃气轮机或MX,而不是两者:

{
  "query": { 
    "bool": {
      "must": [
      {
      "bool": {
        "should": [
        {
          "match": {
            "customerName": "CN"
          }
        },
        {
          "match": {
            "customerName": "MX"
          }
        }
      ]
      {
         "nested": {
           "path": "pages",
            "query": {
              "term": {
                "fieldType": "typeA"
                     }
                   }
                }
              }  
           }
         }
      ]
    }

  }
}
t5fffqht

t5fffqht1#

调整answer以解决此问题。您拥有customerName GT或MX的每个文档的组类型。

{
  "size": 0, 
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "customerName": "GT"
          }
        },
        {
          "match": {
            "customerName": "MX"
          }
        }
      ]
    }
  },
  "aggs": {
    "agg_customer_name": {
      "nested": {
        "path": "pages"
      },
      "aggs": {
        "agg_field_type": {
          "terms": {
            "field": "pages.fieldType.keyword",
            "size": 10
          }
        }
      }
    }
  }
}

回应

"aggregations": {
    "agg_customer_name": {
      "doc_count": 8,
      "agg_field_type": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "typeA",
            "doc_count": 4
          },
          {
            "key": "typeB",
            "doc_count": 2
          },
          {
            "key": "typeC",
            "doc_count": 2
          }
        ]
      }
    }
  }
}

相关问题