2013-03-29 5 views
2

J'apprends Elasticsearch, donc je ne suis pas sûr que cette requête soit correcte. J'ai vérifié que les données sont indexées, mais je ne reçois aucun résultat. Qu'est-ce que je fais mal? Ne devrait-il pas avoir un coup sur une voiture où le nom du créateur est Steve?Interrogation d'un document imbriqué Elasticsearch

builder 
.startObject() 
    .startObject("car") 
     .field("type", "nested") 
     .startObject("properties") 
      .startObject("creators") 
       .field("type", "nested")      
      .endObject()     
     .endObject() 
    .endObject() 
.endObject(); 


{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "car.creators.name": "Steve" 
      } 
     } 
     ], 
     "must_not": [], 
     "should": [] 
    } 
    }, 
    "from": 0, 
    "size": 50, 
    "sort": [], 
    "facets": {} 
} 

Répondre

8

tout d'abord, afin de rechercher les champs imbriqués, vous devez utiliser nested query:

curl -XDELETE localhost:9200/test 
curl -XPUT localhost:9200/test -d '{ 
    "settings": { 
     "index.number_of_shards": 1, 
     "index.number_of_replicas": 0 
    }, 
    "mappings": { 
      "car": { 
       "properties": { 
        "creators" : { 
         "type": "nested", 
         "properties": { 
          "name": {"type":"string"} 
         } 
        } 
       } 
      } 
     } 
    } 
} 
' 
curl -XPOST localhost:9200/test/car/1 -d '{ 
    "creators": { 
     "name": "Steve" 
    } 
} 
' 
curl -X POST 'http://localhost:9200/test/_refresh' 
echo 
curl -X GET 'http://localhost:9200/test/car/_search?pretty' -d ' { 
    "query": { 
     "nested": { 
      "path": "creators", 
      "query": { 
       "bool": { 
        "must": [{ 
         "match": { 
          "creators.name": "Steve" 
         } 
        }], 
        "must_not": [], 
        "should": [] 
       } 
      } 
     } 
    }, 
    "from": 0, 
    "size": 50, 
    "sort": [], 
    "facets": {} 
} 
' 

Si car.creators.name a été indexé en utilisant un analyseur classique alors {"term": {"creators.name": "Steve"}} ne trouvera rien parce que mot Steve a été indexé comme steve et le term query ne réalise pas d'analyse. Donc, il pourrait être préférable de le remplacer par le match query{"match": {"creators.name": "Steve"}}.

+0

Merci! J'ai dû déplacer le champ de chemin hors de l'objet de requête et insérer des "créateurs" dans le chemin et utiliser seulement creators.name dans le terme. Est-ce que ça sonne faux ou est-ce correct? – LuckyLuke

+0

Oui, vous avez raison. Path doit être au même niveau que query et doit contenir "car.creators". J'ai mis à jour l'exemple. Vous n'êtes pas sûr de creators.name dans le terme. La voiture est-elle un type dans votre cas? – imotov

+0

Oui, la voiture est un type? Puisque j'apprends sur Elasticsearch, cela vous dérangerait-il d'expliquer pourquoi je n'en ai pas besoin et que vous réussissez à le faire fonctionner? – LuckyLuke

Questions connexes