检查字段是否存在于elasticsearch嵌套聚合下
问题描述:
试图执行ES查询时,我试图对数组中的对象进行嵌套过滤时遇到了问题。检查字段是否存在于elasticsearch嵌套聚合下
"_index": "events_2015-07-08",
"_type": "my_type",
"_source":{
...
...
"custom_data":{
"className:"....."
}
}
到:
"_index": "events_2015-07-08",
"_type": "my_type",
"_source":{
...
...
"custom_data":[ //THIS CHANGED FROM AN OBJECT TO AN ARRAY OF OBJECTS
{
"key":".....",
"val":"....."
},
{
"key":".....",
"val":"....."
}
]
}
此嵌套过滤器的工作原理上有新的数据结构指标优良:我们的数据的结构已被更改
{
"nested": {
"path": "custom_data",
"filter": {
"bool": {
"must": [
{
"term":
{
"custom_data.key": "className"
}
},
{
"term": {
"custom_data.val": "SOME_VALUE"
}
}
]
}
},
"_cache": true
}
}
然而,它失败当浏览具有较旧数据结构的索引时,将无法添加该功能。理想情况下,我可以找到两个数据结构,但在这一点上,我会解决“优雅的失败”,即只是不返回结构旧的结果。
我曾尝试在字段“custom_data.key”和“不存在”字段“custom_data.className”中添加“存在”过滤器,但我不断收到“SearchParseException [[events_2015- 07-01] [0]:从[-1],大小[-1]:解析失败[解析失败源”
答
有一个indices
filter(和查询),其可用来执行有条件的过滤器(和查询)基于索引。
{
"query" : {
"filtered" : {
"filter" : {
"indices" : {
"indices" : ["old-index-1", "old-index-2"],
"filter" : {
"term" : {
"className" : "SOME_VALUE"
}
},
"no_match_filter" : {
"nested" : { ... }
}
}
}
}
}
}
使用此功能,您应该能够从旧映射转换到新映射。