我正在从SOLR迁移到Elasticsearch,并努力让聚合工作正常。
在我的索引中有一个单个文档,类似于以下json结构:
{
"id": 1,
"title": "some title",
"profile": {
"colour": "GREY",
"brand": "SOME_BRAND",
},
"user_id": 1,
"created_at": "2017-09-09T13:54:30.304Z",
"updated_at": "2017-09-09T13:54:50.282Z",
"email": "john@example.com",
}
我可以使用以下方式查询我的文档:
GET /index/_search
{
"query": {
"match_all": {}
}
}
我想(出于某种原因)仅在电子邮件上聚合。所以我用:
GET /index/_search
{
"query": {
"match_all": {}
},
"aggs": {
"emails": {
"terms": {
"field": "email"
}
}
}
}
如果我要使用SOLR执行此操作,我会收到有关单个文档的电影地址john@example.com的方面。
然而弹性回归:
{
**SNIP**
"aggregations": {
"emails": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
}
}
我还想检索散列上的聚合,例如个人资料['颜色']
我试过了:
GET /index/_search
{
"query": {
"match_all": {}
},
"aggs": {
"profile_colour": {
"terms": {
"field": "profile",
"scripts": {
"inline": "doc.profile.colour"
}
}
}
}
}
但是结果再次为零。似乎我尝试的每件事都没有聚合。我在这里错过了一些非常简单的东西..
答案 0 :(得分:1)
您的JSON文档格式错误,请删除此处的逗号
"brand": "SOME_BRAND",
在这里
"email": "john@example.com",
一切都会奏效(至少在这里,我在ES 1.7.3上)。请注意,在以下示例中,我没有为这些字段创建指定映射:
"aggregations": {
"emails": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "example.com",
"doc_count": 1
},
{
"key": "john",
"doc_count": 1
}
]
}
}
我认为这是错误的,因为整个电子邮件应该作为单个关键字进行管理。