我想在ElasticSearch中创建一个原始的嵌套聚合,但我能让它运行起来。
我的文件如下:
{
"_index": "items",
"_type": "frame_spec",
"_id": "19770602001",
"_score": 1,
"_source": {
"item_type_name": "frame_spec",
"status": "published",
"creation_date": "2016-02-18T11:19:15Z",
"last_change_date": "2016-02-18T11:19:15Z",
"publishing_date": "2016-02-18T11:19:15Z",
"attributes": [
{
"brand": "Sun"
},
{
"model": "Sunglasses1"
},
{
"eyesize": "56"
},
{
"opc": "19770602001"
},
{
"madein": "UNITED KINGDOM"
}
]
}
}
我想要做的是根据其中一个属性进行聚合。我无法使用“attributes.model”(例如)进行常规聚合,因为其中一些包含空格。所以我尝试使用“原始”属性,但似乎ES认为它是一个普通的属性,并且不会返回任何结果。
这是我尝试过的:
{
"size": 0,
"aggs": {
"brand": {
"terms": {
"field": "attributes.brand.raw"
}
}
}
}
但我没有结果。
你能解决这个问题吗?
答案 0 :(得分:0)
您应该在映射中使用dynamic_template
来捕获所有attributes.*
字符串字段,并为所有字符串创建raw
子字段。对于除字符串之外的其他类型,您实际上不需要raw
个字段。您需要删除当前索引,然后使用以下内容重新创建它:
DELETE items
PUT items
{
"mappings": {
"frame_spec": {
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"path_match": "attributes.*",
"mapping": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed",
"ignore_above": 256
}
}
}
}
}
]
}
}
}
之后,您需要重新填充索引,然后才能运行此命令:
POST /items/_search
{
"size": 0,
"aggs": {
"brand": {
"terms": {
"field": "attributes.brand.raw"
}
}
}
}