我正在尝试使用elasticsearch实现自动完成功能。我正在研究的指数的结构是这个
"title": "blog post 1",
"body": "body of the blog post",
"category": "programming",
"locations": [
{"name": "united states"},
{"name": "new york"},
{"name": "venice"}
]
我正在尝试使用嵌套聚合。我正在使用的映射是
{
blog : {
mappings : {
tag : {
properties : {
body : {
type : string
},
category : {
type : string
},
locations : {
properties : {
name : {
type : string
}
}
},
title : {
type : string
}
}
}
}
}
}
应该基于locations.name
聚合结果的查询是
GET /blog/tag/_search
{
"size": 0,
"query": {
"match": {
"locations.name": "montreal"
}
},
"aggs": {
"aggregated_locations": {
"nested": {
"path": "locations"
},
"aggs": {
"filtered_locations": {
"terms": {
"fields": "locations.name"
}
}
}
}
}
}
目前我正在使用chromesearch的弹性搜索执行上述请求。上面的查询给出了一个错误,这个错误很长但是如果有人提示我也可以发布。我想我在解释嵌套聚合的含义时可能是错的,这意味着我的映射是错误的。但我无法弄清楚问题出在哪里。
答案 0 :(得分:2)
您的地图中有一些缺失的部分,您需要将位置字段设置为nested
类型,而不是分析内部字段以便能够根据您的期望进行汇总:
PUT blog
{
"mappings": {
"tag": {
"properties": {
"body": {
"type": "string"
},
"category": {
"type": "string"
},
"locations": {
"type": "nested",
"properties": {
"name": {
"type": "string",
"index": "not_analyzed"
}
}
},
"title": {
"type": "string"
}
}
}
}
}
然后运行以下查询以过滤嵌套字段,并在嵌套字段上聚合:
GET blog/_search
{
"size": 0,
"query": {
"nested": {
"path": "locations",
"query": {
"match": {
"locations.name": "montreal"
}
}
}
},
"aggs": {
"aggregated_locations": {
"nested": {
"path": "locations"
},
"aggs": {
"filtered": {
"terms": {
"field": "locations.name"
}
}
}
}
}
}
可以在意义上复制/粘贴这些查询(https://www.elastic.co/guide/en/sense/current/installing.html)