我有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。
当我在没有滚动的情况下简单地运行并给出大小 = 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 条消息。
那么我在这里还需要做什么才能获取所有消息呢?
还有其他更好的方法吗?
尝试将 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')
如果你的数据相当大(假设不仅仅是10k(,你将不得不使用eg。滚动功能。如果不是这种情况,您可以仅使用"发件人/大小"选项,但请记住,from+size 不能超过 index.max_result_window 参数。另请参阅: 起始/大小 |ES 7.x