如何为Python Elasticsearch mSearch创建请求体

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的信息.


tsa*_*ein 6

如果您正在使用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)