我有ElasticSearch 5.2并使用python 3.5检索消息(仅不获取更新)。 我的搜索条件共有10000条以上的消息。
我浏览了纸卷,但是花费的时间太长。
from elasticsearch import Elasticsearch
es = Elasticsearch([{'host': 'my-host', 'port': 9200}])
sBody = """
{
"query": {
"bool": {
"must": {
"match": {
"header.batchId": "batch_id_1"
}
}
}
}
}
"""
response = es.search(
index='index.name',
body=sBody,
scroll='2m'
)
scroll_id = response['_scroll_id']
out = []
while len(response['hits']['hits']):
response = es.scroll(scroll_id=scroll_id, scroll='2m')
out += response
print(out)
以上示例中的总消息为〜166500。
当我简单地没有滚动地运行并且给出size = 10000时,我看到消息退得更快了。 当然,它们并不是全部的消息,对我没有用,但是10000条消息和总消息之间的差异并不大,但是花费的时间很大。
接下来,我尝试使用elasticsearch_dsl
其他代码:
from elasticsearch_dsl import Search, Q
from elasticsearch_dsl.query import Match
qx = Q({'bool': {'must': { 'match' : {'header.batchId' : 'batch_id_1'}}}})
s = Search(using=es, index="index.name").query(qx)
response = s.execute()
print('Total %d hits found.' % response.hits.total)
上面的代码给出了正确的消息总数。
但是当我尝试遍历响应时,它仅给出默认的10条消息。
那么我在这里还需要做些什么来获取所有消息?
还有其他更好的方法吗?
答案 0 :(得分:0)
尝试将size参数传递给es.search()调用。
size –要返回的点击数(默认值:10)
例如:es.search(index=logs_index, body=my_query, size=1000)
es = Elasticsearch([{'host': 'my-host', 'port': 9200}])
doc = {
'size' : 10000,
'query': {
'match_all' : {}
}
}
res = es.search(index='index.name', body=sBody, scroll='2m')
答案 1 :(得分:0)
如果您的数据很大(比如说不止10k),则必须使用例如。滚动功能。如果不是这种情况,则只能使用From / Size选项,但是请记住,from + size不能超过index.max_result_window参数。查看更多:From/Size | ES 7.x