2017-05-30 6 views
0

J'ai un document d'utilisateur avec un champ appelé expériences qui est un tableau d'objets, comme:ElasticSearch connecter plage et terme même élément du tableau

{ 
    "experiences": [ 
    { 
     "end_date": "2017-03-02", 
     "is_valid": false 
    }, 
    { 
     "end_date": "2015-03-02", 
     "is_valid": true 
    } 
    ] 
} 

Avec ce document, je dois rechercher des utilisateurs où fin date est dans l'année dernière et is_valid est vrai. A cette époque, j'ai une requête -> bool et j'ajouter deux doivent là, une gamme pour la date_fin et un terme pour la is_valid.

{ 
    "query": { 
    "bool": { 
     "must": { 
     "term": { 
      "experiences.is_valid": true 
     }, 
     "range": { 
      "experiences.end_date": { 
      "gte": "now-1y", 
      "lte": "now" 
      } 
     }, 
     } 
    } 
    } 
} 

Le résultat est que cet utilisateur est sélectionné parce qu'il a un date_fin l'année dernière (la première exp.) Et une autre exp. avec is_valid true. Bien sûr, ce n'est pas ce dont j'ai besoin, car j'ai besoin que end_date et is_valid soit référencé au même objet, mais comment pouvons-nous faire cela sur Elasticsearch?

Mapping:

"experiences": { 
    "properties": { 
    "comment": { 
     "type": "text", 
     "fields": { 
     "keyword": { 
      "type": "keyword", 
      "ignore_above": 256 
     } 
     } 
    }, 
    "end_date": { 
     "type": "date" 
    }, 
    "id": { 
     "type": "long" 
    }, 
    "is_valid": { 
     "type": "boolean" 
    }, 
    "start_date": { 
     "type": "date" 
    } 
    } 
} 
+0

Partager le mappage de votre index .. 'GET index/type/_mapping'. Je suppose que l'expérience est de type 'object'. – Richa

+0

Ajouté, mais il n'y a pas de "type" pour les expériences ... – Grork

+1

La valeur par défaut est "Objet" .. :) – Richa

Répondre

3

Vous devez changer experiences de type à Nested data type.

Appliquer ensuite nested requête:

{ 
"query": { 
    "nested": { 
    "path": "experiences", 
    "query": { 
     "bool": { 
      "must": [ 
       { 
       "term": { 
        "experiences.is_valid": true 
       } 
       }, 
       { 
       "range": { 
        "experiences.end_date": { 
         "gte": "now-1y", 
         "lte": "now" 
        } 
       } 
       } 
      ] 
     } 
    } 
    } 
    } 
} 

Ceci est dû à la manière des tableaux d'objets sont aplaties en ElasticSearch. Etudier plus here

+0

Merci, je vais essayer dans les prochains jours! – Grork