如何在Elasticsearch中处理聚合(分组依据)

时间:2019-04-29 09:10:26

标签: node.js elasticsearch elasticsearch-aggregation

我正在从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 

SQL RESULT

我已经尝试过了,但是没有用

{
    "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
            }
        }
    }
}

ES RESULT

2 个答案:

答案 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。 -还共享索引映射,这样会使图片更清晰。