2016-12-21 1 views
1

Ma cartographie est:ElasticSearch 2.4 EXISTE filtre pour les objets imbriqués qui ne travaillent pas

"properties": { 
    "user": { 
    "type": "nested", 
    "properties": { 
     "id": { 
     "type": "integer" 
     }, 
     "is_active": { 
     "type": "boolean", 
     "null_value": false 
     }, 
     "username": { 
     "type": "string" 
     } 
    } 
    }, 

Je veux obtenir tous les documents qui ne sont pas un champ user.

J'ai essayé:

GET /index/type/_search 
{ 
    "query": { 
    "bool": { 
     "must_not": [ 
     { 
      "exists": { 
      "field": "user" 
      } 
     } 
     ] 
    } 
    } 
} 

qui retourne tous les documents. Sur la base de ElasticSearch 2.x exists filter for nested field doesn't work, j'ai essayé aussi:

GET /index/type/_search 
{ 
    "query": { 
    "nested": { 
     "path": "user", 
     "query": { 
     "bool": { 
      "must_not": [ 
      { 
       "exists": { 
       "field": "user" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

qui retourne 0 documents.

Quelle est la requête correcte pour obtenir tous les documents manquant le champ user?

+0

Pouvez-vous essayer de tester l'existence du ' user.id' field à la place? Si le document parent n'a pas de champ 'user', alors il n'aura pas de champ' user.id'. – Val

+0

Je suppose que cela fonctionnerait assez bien, mais il manquera un cas de bord où l'utilisateur est défini mais vide. – pmishev

Répondre

2

J'ai trouvé la syntaxe correcte, il aurait dû être:

GET /index/type/_search 
{ 
    "query": { 
    "bool": { 
     "must_not": [ 
     { 
      "nested": { 
      "path": "user", 
      "query": { 
       "exists": { 
       "field": "user" 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
0

Essayez d'utiliser le parent de l'utilisateur, ici obj

GET users/users/_search 
{ 
    "query": { 
    "bool": { 
     "must_not": [ 
     { 
      "exists": { 
      "field": "obj.user" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

l'utilisateur n'a pas de parent - c'est un champ dans le document, pas dans un objet imbriqué – pmishev