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(" 没查到数据")
关键点:
msearch()的请求体是个列表,每两个元素一组:第一个是指定索引的header,第二个是具体的查询DSL- 返回的
response['responses']是个列表,按顺序对应每个查询的结果 - 每个结果的结构和单次搜索
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

