我正在从SQL迁移到Elasticsearch,但是我遇到了一些聚合问题,尤其是 group by
我的查询看起来像
SELECT count(*) as total,country_code
FROM orders
WHERE product_id = ?
GROUP BY country_code
ORDER BY total desc LIMIT 3
我已经尝试过了,但是没有用
{
"query": {
"bool": {
"must": [
{
"match": {
"line_items.product_id": {
"query": "0001112223333"
}
}
}
]
}
},
"from": 0,
"size": 3,
"aggregations": {
"country_code": {
"aggregations": {
"COUNT(*)": {
"value_count": {
"field": "_index"
}
}
},
"terms": {
"field": "country_code",
"size": 200
}
}
}
}
答案 0 :(得分:0)
根据图像,使用keyword
数据类型而不是text
。
根据关键字的链接
它们通常用于过滤(在以下所有博客文章中找到我 状态已发布),排序和汇总。关键词 字段只能按其确切值进行搜索。
观察到这些错误的原因是因为您试图对text
数据类型运行聚合查询。文本数据类型经过Analysis阶段,在此阶段,ES将获取该值,将其分解为令牌并将其存储在反向索引中,
我建议您使用multi-fields,其中country_code
的映射如下:
{
"properties":{
"country_code":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword"
}
}
}
}
}
{
"query": {
"bool": {
"must": [
{
"match": {
"line_items.product_id": {
"query": "0001112223333"
}
}
}
]
}
},
"from": 0,
"size": 3,
"aggregations": {
"country_code": {
"aggregations": {
"COUNT(*)": {
"value_count": {
"field": "_index"
}
}
},
"terms": {
"field": "country_code.keyword", <----- change this
"size": 200
}
}
}
}
请注意上面的字段,我在聚合查询中使用country_code.keyword
。
希望这会有所帮助!
答案 1 :(得分:0)
您应该考虑使用产品ID作为关键字而不是文本类型,然后在其上使用术语查询而不是匹配查询,因为这样会更加有效。另外,由于您不需要文档中的任何数据,因此可以将查询的大小设置为0。
此外,您应该在country_code字段的映射中使用关键字类型。
这个简单的查询应该可以完成您的工作-
fun1
P.S。 -还共享索引映射,这样会使图片更清晰。