一般问题是我在弹性搜索中创建了一个名称/值映射来处理标签的潜在巨大用户输入 - 而不是允许人们只能用新属性创建文档的开放模式。
我有一个弹性搜索映射,如下所示:
"Tags" : {
"properties" : {
"Value" : {
"analyzer" : "keyword",
"type" : "string"
},
"Name" : {
"analyzer" : "keyword",
"type" : "string"
}
}
},
记录看起来像这样
"Tags" : [
{
"Name" : "group",
"Value" : "foobar"
},
{
"Name" : "season",
"Value" : "winter"
}
],
我正在尝试使用弹性搜索查询来编写一个只聚合季节条目的脚本。
...
"script" : "for (int i = 0; i < doc['Tags.Value'].values.length; i++) {
if (doc['Tags.Value'].values[i] == 'season') {
return doc['Tags.Names'].values[i]
} }"
...
我已经完成了上述脚本的大约200种排列,并且它并没有完全返回我希望看到的结果。
答案 0 :(得分:0)
您的Tags
字段应为nested
,以便您可以编写nested
个查询,仅选择season
代码,然后您只能对这些值进行汇总。如果你有大量的标签,这将允许你抛弃那个表现非常糟糕的脚本。
所以你的映射需要看起来像这样:
"Tags" : {
"type": "nested", <---- add this
"properties" : {
"Value" : {
"analyzer" : "keyword",
"type" : "string"
},
"Name" : {
"analyzer" : "keyword",
"type" : "string"
}
}
},
然后,您的查询应在nested
标记名称中包含season
子句,以便您的terms
聚合可以简单地处理这些值。
{
"query": {
"filtered": {
"filter": {
"nested": {
"path": "Tags",
"filter": {
"term": {
"Tags.Name": "season"
}
}
}
}
}
},
"aggs": {
"season_tags": {
"nested": {
"path": "Tags"
},
"aggs": {
"season_values": {
"terms": {
"field": "Tags.Value"
}
}
}
}
}
}