Vấn đề chính là Elaticsearch không có cách riêng để lấy danh sách tất cả các tài liệu trong một chỉ mục nhất định. Bạn có thể sử dụng API tìm kiếm, nhưng điều này sẽ chỉ trả về một tài liệu tại một thời điểm.
Tôi đang sử dụng django-elasticsearch-dsl và tôi muốn lấy danh sách tất cả tài liệu trong chỉ mục. Làm thế nào tôi có thể làm điều đó?
A:
Bạn có thể sử dụng Search đối tượng từ django_elasticsearch_dsl. Nó là một lớp con của ElasticsearchDSL Tìm kiếm đối tượng, vì vậy bạn cũng có thể sử dụng tất cả các phương pháp từ đó. Các tài liệu cho điều đó ở đây: https://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#the-search-object
<code>from django_elasticsearch_dsl import Search, Indexs = Search(index='blog')
.query('match', title='python')response = s.execute()
for hit in response: # iterate over hits from response object
print(hit) # print each hit as a dict (default)for hit in s: # iterate over hits from search query directly
print(hit) # print each hit as a dict (default)for hit in s[0:10]: # slice results to get only first 10 hits
print(hit) # print each hit as a dict (default)len(s) # number of total hits found by query (slow!) <--- this is what you want! <--- this is what you want! <--- this is what you want! <--- this is what you want! <--- this is what you want! len(response) # number of total hits found by query (slow!) <--- this is what you want! <--- this is what you want! <--- this is what you want! <--- this is what you want! list(s)[0] # first result as a Python dictionary list(response)[0] # first result as a Python dictionary response[0] # first result as an ElasticSearch Hit response[0].meta # metadata associated with the Hit response[0].meta.score # score associated with the Hit response[0].title # title field value list(response)[1]['title'] ## second result's 'title' field value<;/pre>;<;br />;>;br />;The above code will return all documents matching your query, but it will not return any fields other than _id and _type unless they are explicitly requested via source(). To retrieve more fields, use source():<;br />;from django_elasticsearch_dsl import Search, Index, F ;from elasticsearch_dsl import Q ;import json ;import pprint ;pp = pprint.PrettyPrinter();pprint = pp.pprint ;s = Search().query('match', title='python').source([ 'title', 'body' ]) ;for i in range((len(s))): pprint((json.loads((str)(s[i]).replace("'", """)))) ;## or simply do it like below :## [{'body': 'Python and Django go together like peanut butter and jelly.'