2015-07-12 147 views
0

试图执行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]:解析失败[解析失败源”

回答

0

有一个indices filter(和查询),其可用来执行有条件的过滤器(和查询)基于索引

{ 
    "query" : { 
    "filtered" : { 
     "filter" : { 
     "indices" : { 
      "indices" : ["old-index-1", "old-index-2"], 
      "filter" : { 
      "term" : { 
       "className" : "SOME_VALUE" 
      } 
      }, 
      "no_match_filter" : { 
      "nested" : { ... } 
      } 
     } 
     } 
    } 
    } 
} 

使用此功能,您应该能够从旧映射转换到新映射。

相关问题