2017-01-25 7 views
0

У меня возникла проблема при доступе к данным inner_hits с использованием клиента Python elasticsearch_dsl. Любая попытка использования встроенного объекта Response в meta.inner_hits дает KeyError в «_type» в объекте-контейнере. Следующий код полностью самодостаточным, так что каждый должен быть в состоянии воспроизвести тот же результат, используя Python 2.7 и elasticsearch_dsl 5.0.0:KeyError accessing inner_hits в elasticsearch_dsl Клиент Python

from elasticsearch import Elasticsearch 
from elasticsearch_dsl import Index, Mapping, Nested, Search, Q 
from elasticsearch_dsl.connections import connections 

index = "test_index" 

es_con = connections.create_connection(hosts=["localhost:9200"]) 
es_index = Index(index) 
if es_index.exists(): 
    es_index.delete() 
es_index.create() 

para_mapping = Mapping("paragraph") 
para_mapping.field("sentences", Nested()) 
para_mapping.save(index) 

test_paras = {} 
for a in range(2): 
    test_paras[a] = { 
     "label": "Test Paragraph p{}".format(a), 
     "sentences": [] 
    } 

    for b in range(2): 
     test_sent = { 
      "text": "Test Sentence p{}s{}".format(a, b), 
     } 

     test_paras[a]["sentences"].append(test_sent) 

for idx, para in test_paras.iteritems(): 
    para_id = "para_id_p{}".format(idx) 
    es_con.create(
     index=index, 
     doc_type="paragraph", 
     id=para_id, 
     body=para 
    ) 

es_index.flush() 

q_1 = Search(using=es_con).index(index).doc_type('paragraph') 
q_2 = q_1 = q_1.query(
    'nested', path='sentences', query=Q('term', **{"sentences.text": "p0s1"}), inner_hits={} 
) 
q_1 = q_1.execute() 
# We got the expected paragraph 
print "PARA_ID:       ", q_1.hits[0].meta.id 
# With all sentences 
print "PARA[SENTENCES]:     ", q_1.hits[0].sentences 
# We can see inner_hits is included in para.meta 
print "DIR PARA.META:      ", dir(q_1.hits[0].meta) 
# And it contains a "sentences" object 
print "DIR PARA.META.INNER_HITS:   ", dir(q_1.hits[0].meta.inner_hits) 
# Of type elasticsearch_dsl.result.Response 
print "TYPE PARA.META.INNER_HITS.SENTENCES:", type(q_1.hits[0].meta.inner_hits.sentences) 
# That contains a "hits" object 
print "DIR PARA.META.INNER_HITS.SENTENCES: ", dir(q_1.hits[0].meta.inner_hits.sentences) 
# But every attempted action yields a KeyError: '_type' in result.AttrList() 
try: 
    print q_1.hits[0].meta.inner_hits.sentences 
except KeyError as e: 
    print "\nException:", type(e) 
    print "Message:", e 

# Uncomment the following line to see full exception detail 
# print dir(q.hits[0].meta.inner_hits.sentences.hits) 

# The same query using the base-level API 
es = Elasticsearch() 

results = es.search(index=index, body=q_2.to_dict()) 
# This works just fine. 
print "\nES RESULT:" 
print results["hits"]["hits"][0]["inner_hits"]["sentences"]["hits"]["hits"][0]["_source"]["text"] 

Является ли это ошибка в API?

ответ

1

Это ошибка, в которой мы учитываем только inner_hits в отношениях между родителями и детьми, а не nested. Я создал проблему для отслеживания исправления: https://github.com/elastic/elasticsearch-dsl-py/issues/565

Спасибо за отчет!