簡體   English   中英

如何計算嵌套字段內的字段數? - 彈性搜索

[英]How to count number of fields inside nested field? - Elasticsearch

我做了以下映射。 我想計算每個嵌套字段“產品”中的產品數量(分別針對每個文檔)。 我還想做一個直方圖聚合,以便我知道特定桶大小的數量。

PUT /receipts
{
  "mappings": {
    "properties": {
      "id" : {
        "type": "integer"
      },
      "user_id" : {
        "type": "integer"
      },
      "date" : {
        "type": "date"
      },
      "sum" : {
        "type": "double"
      },
    "products" : {
      "type": "nested",
      "properties": {
        "name" : {
          "type" : "text"
        },
        "number" : {
          "type" : "double"
        },
        "price_single" : {
          "type" : "double"
        },
        "price_total" : {
          "type" : "double"
        }
      }
    }
}
}
}

我試過這個查詢,但我分別得到所有產品的數量而不是每個文檔的產品數量。

GET /receipts/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "terms": {
      "nested": {
        "path": "products"
      },
      "aggs": {
        "bucket_size": {
          "value_count": {
            "field": "products"
          }
        }
      }
    }
  }
}

查詢結果:

"aggregations" : {
    "terms" : {
      "doc_count" : 6552,
      "bucket_size" : {
        "value" : 0
      }
    }
  }

更新

現在我有這個代碼,我為每個 id 制作單獨的桶並計算其中的產品數量。

GET /receipts/_search
{
  "query": {
    "match_all": {}
  },
  "size" : 0,
  "aggs": {
    "terms":{
      "terms":{
        "field": "_id"
      },
      "aggs": {
        "nested": {
          "nested": {
            "path": "products"
          },
          "aggs": {
            "bucket_size": {
              "value_count": {
                "field": "products.number"
              }
            }
          }
        }
      }
    }
  }
}

查詢結果:

"aggregations" : {
    "terms" : {
      "doc_count_error_upper_bound" : 5,
      "sum_other_doc_count" : 490,
      "buckets" : [
        {
          "key" : "1",
          "doc_count" : 1,
          "nested" : {
            "doc_count" : 21,
            "bucket_size" : {
              "value" : 21
            }
          }
        },
        {
          "key" : "10",
          "doc_count" : 1,
          "nested" : {
            "doc_count" : 5,
            "bucket_size" : {
              "value" : 5
            }
          }
        },
        {
          "key" : "100",
          "doc_count" : 1,
          "nested" : {
            "doc_count" : 12,
            "bucket_size" : {
              "value" : 12
            }
          }
        },
...

是否可以將這些值 (21, 5, 12, ...) 分組到桶中以制作它們的直方圖?

products只是單個產品數組的路徑,而不是可聚合的字段。 因此,您需要在您的產品字段之一上使用它 - 例如number

GET receipts/_search
{
  "size": 0,
  "aggs": {
    "terms": {
      "nested": {
        "path": "products"
      },
      "aggs": {
        "bucket_size": {
          "value_count": {
            "field": "products.number"
          }
        }
      }
    }
  }
}

請注意,產品沒有number ,它不會對總數做出貢獻。 因此,最佳做法是始終在每個字段中包含一個 ID,然后在該字段上進行聚合。

或者,您可以使用腳本來解決缺失值。 幸運的是value_count重復數據刪除-這意味着,如果兩種產品都是一樣的和/或具有空值,它們還是會被算作二:

GET receipts/_search
{
  "size": 0,
  "aggs": {
    "terms": {
      "nested": {
        "path": "products"
      },
      "aggs": {
        "bucket_size": {
          "value_count": {
            "script": {
              "source": "doc['products.number'].toString()"
            }
          }
        }
      }
    }
  }
}

更新

您還可以使用嵌套的復合聚合,它會為您提供帶有相應收據 ID 的直方圖產品計數:

GET /receipts/_search
{
  "size": 0,
  "aggs": {
    "my_aggs": {
      "nested": {
        "path": "products"
      },
      "aggs": {
        "composite_parent": {
          "composite": {
            "sources": [
              {
                "receipt_id": {
                  "terms": {
                    "field": "_id"
                  }
                }
              },
              {
                "product_number": {
                  "histogram": {
                    "field": "products.number",
                    "interval": 1
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
}

interval是可修改的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM