Pythonを使ってElasticsearchからデータを取ってくる際、どうも計算が合わない。 なんでだろうなぁと思い調べてみたところ、どうやらElasticsearchではデータを取得する際、デフォルトでは10件までしか取得できないらしい。で、10件以上のデータを取得する場合だと、以下の方法があるようだ。

  • scrollでデータを繰り返し取得して条件にあったデータを全て取得してくる
  • query実行時にsizeを指定することで指定した件数までのデータを取得する(上限は10,000まで?)

上限があるというのもあり、2個目の方法はちょっと… という訳で、scrollで処理をさせることにした。以下、記述例(Elasticsearchへの接続処理等は省略)。

num = 10
s_time = '2m'
data = conn.search(index=self.es_index, doc_type=self.es_doc, scroll=s_time, body=query, size=num, request_timeout=150)

s_id = data['_scroll_id']
s_size = data['hits']['total']
result = data['hits']['hits']
while (s_size > 0):
    data = conn.scroll(scroll_id=s_id, scroll=s_time,request_timeout=150)
    s_id = data['_scroll_id']
    s_size = len(data['hits']['hits'])
    result.extend(data['hits']['hits'])
return result

これで全件のデータを取得できる。