kev*_*son 11 python elasticsearch
我正在尝试在Elasticsearch Python客户端上运行多搜索请求.我可以正确运行单一搜索,但无法弄清楚如何格式化msearch的请求.根据文档,请求的正文需要格式化为:
请求定义(元数据搜索请求定义对),作为换行符分隔的字符串,或序列化的序列序列(每行一个).
创建此请求正文的最佳方法是什么?我一直在寻找例子但似乎找不到任何例子.
lyf*_*ing 17
如果您按照官方文档的演示(甚至认为它是BulkAPI),您将找到如何使用Elasticsearch客户端在python中构建您的请求:
这是换行符分隔的字符串方式:
def msearch():
es = get_es_instance()
search_arr = []
# req_head
search_arr.append({'index': 'my_test_index', 'type': 'doc_type_1'})
# req_body
search_arr.append({"query": {"term" : {"text" : "bag"}}, 'from': 0, 'size': 2})
# req_head
search_arr.append({'index': 'my_test_index', 'type': 'doc_type_2'})
# req_body
search_arr.append({"query": {"match_all" : {}}, 'from': 0, 'size': 2})
request = ''
for each in search_arr:
request += '%s \n' %json.dumps(each)
# as you can see, you just need to feed the <body> parameter,
# and don't need to specify the <index> and <doc_type> as usual
resp = es.msearch(body = request)
Run Code Online (Sandbox Code Playgroud)
如您所见,最终请求由几个req_unit构成.每个req_unit构造如下所示:
request_header(search control about index_name, optional mapping-types, search-types etc.)\n
reqeust_body(which involves query detail about this request)\n
Run Code Online (Sandbox Code Playgroud)
序列化方式的序列序列与前一个序列几乎相同,只是您不需要将其转换为字符串:
def msearch():
es = get_es_instance()
request = []
req_head = {'index': 'my_test_index', 'type': 'doc_type_1'}
req_body = {
'query': {'term': {'text' : 'bag'}},
'from' : 0, 'size': 2 }
request.extend([req_head, req_body])
req_head = {'index': 'my_test_index', 'type': 'doc_type_2'}
req_body = {
'query': {'range': {'price': {'gte': 100, 'lt': 300}}},
'from' : 0, 'size': 2 }
request.extend([req_head, req_body])
resp = es.msearch(body = request)
Run Code Online (Sandbox Code Playgroud)
这是它返回的结构.阅读更多关于msearch的信息.
如果您正在使用elasticsearch-dsl,则可以使用MultiSearch类。
文档中的示例:
from elasticsearch_dsl import MultiSearch, Search
ms = MultiSearch(index='blogs')
ms = ms.add(Search().filter('term', tags='python'))
ms = ms.add(Search().filter('term', tags='elasticsearch'))
responses = ms.execute()
for response in responses:
print("Results for query %r." % response.search.query)
for hit in response:
print(hit.title)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9369 次 |
| 最近记录: |