带pyes的ElasticSearch:批量索引

时间:2013-06-11 06:38:28

标签: elasticsearch pyes

我有一个200M文档索引我想重新索引。

我编写了以下脚本,该脚本遍历旧索引中的文档,并将它们与balk insert一起放入新索引中。

每个批量的大小是2000个文件。

 search_obj = pyes.query.Search(query = pyes.query.MatchAllQuery(), start=resume_from)

 old_index_iterator = self.esconn.search(search_obj, self.index_name)
 counter = 0
 BULK_SIZE = 2000

 for doc in old_index_iterator:
   self.esconn.index(doc=doc, doc_type=DOC_TYPE, index=new_index_name, id=doc.get_id(), bulk=True)
   counter += 1

   if counter % BULK_SIZE == 0:
     self.logger.debug("Refreshing...")
     self.esconn.refresh()
     self.logger.debug("Refresh done.")


 self.esconn.refresh()

观察:

  1. 我得到的速度非常慢:大约150个文件/分钟。
  2. 刷新操作的时间为0.如果我删除了索引命令(只是从数据库中读取) - 我加速了10次。
  3. 结论:

    • 索引忽略bulk = True标志,并将每个文档推送到ES服务器。

    任何人都知道请帮我弄清楚为什么批量= True没有效果?

1 个答案:

答案 0 :(得分:0)

你的低速是关于从旧索引中读取而不是插入新索引。

尝试扫描模式并在阅读时滚动:

result_set = self.esconn.search(pyes.query.MatchAllQuery(),indices=INDEX_NAME, doc_types=INDEX_TYPE, scan=True, scroll_timeout="10m")
for doc in result_set:
    pass # do your insert task

此外,默认刷新大小为400,间隔为1秒,通常不需要重置此设置。