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

时间:2019-06-18 20:34:59

标签: python-3.x elasticsearch

我有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条消息。

那么我在这里还需要做些什么来获取所有消息?

还有其他更好的方法吗?

2 个答案:

答案 0 :(得分:0)

尝试将size参数传递给es.search()调用。

请阅读Documentation

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