gpt4 book ai didi

elasticsearch - 如何计算嵌套字段内的字段数? -Elasticsearch

转载 作者:行者123 更新时间:2023-12-03 02:15:04 25 4
gpt4 key购买 nike

我做了以下映射。我想计算每个嵌套字段“产品”中的产品数量(分别针对每个文档)。我还想进行直方图聚合,以便知道特定存储桶大小的数量。

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中都包含一个ID,然后在该字段上进行汇总。
或者,您可以使用 a script来解决缺少的值。幸运的是 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是可修改的。

关于elasticsearch - 如何计算嵌套字段内的字段数? -Elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63769451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com