在Elasticsearch Javascript客户端进行求和时返回的奇怪值

Weird value returned for sum aggregation in Elasticsearch Javascript client

本文关键字:返回 求和 Javascript Elasticsearch 客户端      更新时间:2023-09-26

我正在尝试使用Elasticsearch的Javascript客户端对数字字段(类型为double)执行求和聚合。

下面是我的代码:

    this.client.search({
        index: "customers",
        body: {
            aggs: {
                counts_in_range: {
                    filter: {
                        range: {
                            timestamp : {
                                gte : startDate,
                                lt : endDate
                            }
                        }
                    },
                    aggs: {
                        counts: {
                            sum : {
                                field : "price"
                            }
                        }
                    }
                }
            }
        }
    }).then(function (resp) {
        cb(resp.aggregations, null);
    }, function (err) {
        cb(null, err);
    });

示例文档:

{
    _index: "customers",
    _type: "purchase",
    _id: "98cb1066-057b-48e1-adff-eb32d9ed75a5",
    _score: 1,
    _source: {
        timestamp: "2014-06-11T18:14:36+03:00",
        itemId: 1,
        price: 0.54
    }
}

我从聚合中得到的是一个很长的数字,例如27549779928520990000,而不是十进制数。问题似乎是,在我的文档中,我存储十进制数,而不是整数。如果我在price字段中存储一个整数,聚合就可以正常工作。

不确定这是否是Javascript客户端的解析问题

当您第一次索引文档时,如果没有指定,则每个字段的类型由elasticsearch决定。在您的示例中,elasticsearch认为您在文档中存储的是整数,即使您稍后将存储十进制数。所以当它计算和的时候,它会尝试只处理整数,但它遇到的是十进制数,因此返回的是长数。为避免这种情况发生,在创建新类型文档时,将每个字段映射到一个核心值。