2013-08-19 28 views
0

在我的應用程序中,我需要不時重新編制所有數據的索引。我已經注意到,第一次索引數據所需的時間(通過批量索引)比後續的重新索引要慢得多。在一種情況下,首次執行索引需要大約2個小時,而後續索引需要大約15分鐘(對相同數據編制索引)。改進ElasticSearch首次索引的方法

雖然第一次索引2小時是合理的,但我很好奇爲什麼後續迭代重新索引要快得多。更重要的是,我想知道是否有任何事情可以改善第一次索引時的性能,例如,也許表明該指數將有多大等

感謝, 埃裏克

回答

2

編輯來引用重拳出擊,以merge_factor因爲已經去除ES 2.0https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_20_setting_changes.html#_merge_and_merge_throttling_settings


由於表明,你確實可以影響(散裝)索引設置 - refresh_interval能暫時設置爲-1,並在完成批量索引後將其設置爲默認值1s 要修改的另一個設置是 merge.policy.merge_factor;將其設置爲較高的值,例如 30,然後返回默認值 10

有一些關於優化大宗索引教程和郵件列表的討論,但這裏的一些官方文檔的鏈接入手:

http://www.elasticsearch.org/guide/reference/index-modules/merge/ http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings/

如果您尚未調整您的JVM的內存設置,您應該。雖然特定於運行Ubuntu 10.04服務器的512MB VPS,但這些設置(http://pastebin.com/mNUGQCLY)應該指向正確的方向。基本上,啓動時將所需數量的RAM分配給Elasticsearch可以改進JVM內存分配/ GC時序。

+0

謝謝詹姆斯。這些信息很有幫助,我將查看merge.policy.merge_factor和引用。非常感激。 – Eric

+0

@詹姆斯你可以提供最新的官方鏈接? – eyal

+1

@eyal,我已根據要求更新了答案。 –

3

是否定義爲你的類型的映射?如果不是,每次ES找到一個新的字段,映射必須更新(並且這影響了整個索引)。

在隨後的索引編制中,映射已經完成。所以你可以做的是顯式映射你的類型。

另外,您可以通過將refresh_interval設置爲更高的值來提高重新索引的速度,look at this benchmark

+0

謝謝達米安。是的,我有一個定義的類型映射,甚至使用refresh_interval。實際上,我最初被「欺騙」,認爲將refresh_interval設置爲-1會顯着提高性能,但實際上是因爲重新索引比第一次索引更快。 – Eric