2017-03-24 1 views
0

Je veux essayer d'utiliser elasticsearch_dsl avec python pour leEn utilisant Python elastisearch_dsl avec des objets imbriqués

import elasticsearch 

es_server = 'my_server_name' 
es_port = '9200' 
es_index_name = 'my_index_name' 
es_connection = Elasticsearch([{'host': es_server, 'port': es_port}]) 

es_query = '{"query":{"bool":{"must":[{"term":{"data.party.fullName":"john do"}}],"must_not":[],"should":[]}},"from":0,"size":1,"sort":[],"facets":{}}' 
my_results = es_connection.search(index=es_index_name, body=es_query) 
print my_results 

es_query ='{"query": {"nested" : {"filter" : {"term" : {"party.phoneList.phoneFullNumber" : "4081234567"}},"path" : "party.phoneList"}},"from" :0,"size" : 1}'; 
my_results = es_connection.search(index=es_index_name, body=es_query) 
print my_results 

suivant, je suis en mesure d'obtenir la 1ère requête, mais je suis pas sûr de la seconde

from elasticsearch import Elasticsearch 
from elasticsearch_dsl import Search, Q 

client = Elasticsearch('my_server:9200') 
s = Search(using=client, index = "my_index").query("term",fullName="john do ") 
response = s.execute() 
print response 

Vous ne savez pas comment faire la requête en utilisant DSL pour l'objet imbriqué party.phoneList.phoneFullNumber

Nouveauté de ES et, par conséquent, n'a pas pu déterminer comment faire les objets imbriqués. J'ai regardé https://github.com/elastic/elasticsearch-dsl-py/issues/28 et j'ai pas pu comprendre.

Merci!

Répondre

1

utiliser juste __ au lieu de . pour contourner les limites de python et la requête nested:

s = Search(using=client, index = "my_index") 
s = s.query("nested", 
    path="party.phoneList", 
    query=Q("term", party__phoneList__phoneFullNumber="4081234567") 
)