доступ к отдельным полям с помощью эластичного поиска dsl в python

Является ли приведенное ниже точным или это должно быть что-то еще?

Я получаю ожидаемые результаты, просто проверяя, является ли это наиболее эффективным способом доступа к отдельным (вложенным) полям.

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search, Q

import json
client = Elasticsearch('my_server')

policy_number = 'POLICY1234'
s = Search(using=client, index = "my_index").query("term",policyNumber=policy_number.lower())
es_response = s.execute()

for hits in es_response:
   print hits['policyNumber']
   print hits.party[0]['fullName']
   print hits.party[0].partyAddress[0]['address1']
   print hits.party[0].partyAddress[0]['city']
   print hits.party[0].phoneList[0]['phoneNumber']

person Naresh MG    schedule 28.03.2017    source источник


Ответы (1)


Вам не нужно вызывать execute вручную, и вам не нужно использовать [] для доступа к полям по имени, вы можете просто использовать доступ к атрибуту:

for hit in s:
   print hit.policyNumber
   print hit.party[0].fullName
   print hit.party[0].partyAddress[0].address1
   print hit.party[0].partyAddress[0].city
   print hit.party[0].phoneList[0].phoneNumber
person Honza Král    schedule 29.03.2017
comment
Полезно знать, не знал, что я могу пропустить выполнение. Если бы я не использовал цикл for и заботился только о первом попадании, я бы ››› es_response = s.execute() ››› print es_response[0].policyNumber ››› print es_response[0].party[ 0].fullName ››› print es_response[0].party[0].phoneList[0].phoneNumber без цикла for и без вызова execute() как мне это сделать, пожалуйста? ››› print s[0].policyNumber не работает - person Naresh MG; 30.03.2017
comment
Это вы должны выполнить, потому что нарезка объекта Search просто вводит ограничения from/size. - person Honza Král; 31.03.2017