2013-06-11 2 views
2

200M 문서 인덱스가 있습니다. 다시 색인하고 싶습니다.ElasticSearch with pyes : 벌크 인덱스

필자는 이전 색인에서 문서를 넘기고 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입니다. 인덱스 명령을 제거하면 (DB에서 읽음) 10 번 속도가 증가합니다.

결론 :

  • 인덱스가 대량 = TRUE 플래그를 무시하고, ES 서버에 모든 단일 문서를 푸시합니다.

누구나 알고있는 이유를 알아보십시오. bulk = True가 효과가없는 이유는 무엇입니까?

+0

이 질문을 확인하십시오. http://stackoverflow.com/questions/9002982/elasticsearch-bulk-index-in-chunks-using-pyes 도움을 받으십시오. –

답변

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 초입니다.