Elasticsearch:获取 python3 中的所有消息(超过 10000 条)



我有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

最新更新