2017-08-04 6 views
0

Salut Je possède ce document ES avec type imbriqué:requêtes imbriquées à la recherche élastique qui devrait appliquer sur tous les objets dans le tableau imbriqué

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

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

      } 

Je veux faire requête additionalData.devices_nested ne contient aucun élément où os_string propriété n'existe pas, ce qui signifie que je veux éviter de tels documents où certaines entrées pourraient avoir ou non la propriété os_string. Voici ma question:

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

Mais je reçois toujours le document exemple comme résultat, car au moins un élément satisfait requête il y a os_string propriété. Est-il possible de faire une requête qui va retourner le document où tous les éléments dans devices_nested a os_string propriété?

Répondre

0

Est-il possible de faire une requête qui retournera un document où tous les éléments de devices_nested ont la propriété os_string?

Oui, c'est possible. Au lieu de doit exister, vous devez utiliser must_not manquant approche.

En suivant la requête, la condition bool à l'intérieur nested correspondra à tous les documents qui n'ont pas os_string champ dans au moins l'un des objets imbriqués, puis, l'must_not extérieur requête exclura ces documents. Par conséquent, vous obtiendrez uniquement les documents qui incluent le champ os_string dans tous les objets imbriqués:

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