Python中如何实现elasticsearch批量检索

如题:
1.通过 id 查找可以使用 mget
2.通过数据批量查找可以使用 msearch,但是效率较低

目前需要通过数据批量查找,有没有什么更好的方式,求解答。
Python中如何实现elasticsearch批量检索

9 回复

bulk 啊


在Python里用Elasticsearch做批量检索,直接用elasticsearch库的msearch()方法就行。先装好库:pip install elasticsearch

下面是个完整例子,假设你ES里有个叫my_index的索引,存着用户数据:

from elasticsearch import Elasticsearch

# 连接ES,默认localhost:9200
es = Elasticsearch()

# 批量查询请求体,每个查询占两行:一行header指定索引,一行query
request_body = [
    {"index": "my_index"},
    {"query": {"match": {"name": "张三"}}, "size": 5},
    {"index": "my_index"},
    {"query": {"term": {"age": 25}}, "size": 3},
    {"index": "my_index"},
    {"query": {"range": {"timestamp": {"gte": "2023-01-01"}}}}
]

# 执行批量查询
response = es.msearch(body=request_body)

# 处理结果
for i, resp in enumerate(response['responses']):
    print(f"第{i+1}个查询结果:")
    if 'hits' in resp:
        for hit in resp['hits']['hits']:
            print(f"  ID: {hit['_id']}, 数据: {hit['_source']}")
    else:
        print("  没查到数据")

关键点:

  1. msearch()的请求体是个列表,每两个元素一组:第一个是指定索引的header,第二个是具体的查询DSL
  2. 返回的response['responses']是个列表,按顺序对应每个查询的结果
  3. 每个结果的结构和单次搜索search()返回的一样,用hits['hits']拿数据

如果查询都在同一个索引,可以在连接时指定默认索引省事:

es = Elasticsearch()
request_body = [
    {},
    {"query": {"match": {"name": "张三"}}},
    {},
    {"query": {"term": {"age": 25}}}
]
response = es.msearch(index="my_index", body=request_body)

批量检索比循环调单次查询快得多,特别是数据量大时。

总结:用msearch()一次发多个查询。

bulk 涉及查询了吗?如何使用呢?我没有找到啊

少量用 fq, 另外排序不要带 score。
量大可以写个插件在 querypaser 里拼 termsquery 再包一层 filterquery。
量再大就要用黑科技了。

感谢大神,能多指点一下吗?检索目前因为需要对 score 排序,还得聚合与高亮,效率极低。

我很多查询都是 fq,都可以改成写插件的方式吗?

ES 每隔一段时间查询总是很慢,有遇到过的大佬吗?

如果是重复查询的话,有可能是缓存问题

索引不怎么变的话可以考虑在 ES 前加 HTTP 缓存,facet 字段最好启用 docvalues

回到顶部