2017-08-04 103 views
0

您好我有ES这个文件与嵌套类型:嵌套查询应适用于所有对象中嵌套数组

{ 
     "id": "92210f7f-b8a4-4d55-877d-8708154aa004", 
      "additionalData": { 

       "devices_nested": [ 
       { 
        "version_string": "1" 
       }, 
       { 
        "os_string": "Windows", 
        "version_string": "3" 
       }, 
       { 
        "os_string": "Centos" 
       } 
       ] 

      } 

我想要做的查询additionalData.devices_nested不包含任何元素os_string属性不存在,这意味着我想避免这样的文件,其中一些条目可能具有或不具有os_string属性。这里是我的查询:

{ 
    "query": { 
    "nested": { 
     "query": { 
     "bool": { 
      "must": { 
      "exists": { 
       "field": "additionalData.devices_nested.os_string" 
      } 
      } 
     } 
     }, 
     "path": "additionalData.devices_nested" 
    } 
    } 
} 

但我总是得到例如文档作为结果,因为至少有一个元素满足查询有os_string财产。 是否有可能使查询返回文档,其中devices_nested中的所有元素都有os_string属性?

回答

0

是否有可能使查询将返回文件,其中devices_nested中的所有元素都具有os_string属性?

是的,这是可能的。而不是必须存在,你必须使用必须不缺的方法。

在下面的查询,里面nested的布尔条件将匹配没有os_string场嵌套对象中的至少一个,然后,外面must_not查询将排除这些文件的所有文件。因此,您将只在所有嵌套对象中获得包含os_string字段的文档:

{ 
    "query": { 
    "bool": { 
     "must_not": { 
      "nested": { 
       "query": { 
       "bool": { 
        "must_not": { 
         "exists": { 
          "field": "additionalData.devices_nested.os_string" 
         } 
        } 
       } 
       }, 
       "path": "additionalData.devices_nested" 
      } 
     } 
    } 
    } 
}