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
これで全件のデータを取得できる。