? 根據(jù)以前的測試,forceMerge段合并,將段的個數(shù)合并成一個。帶來了將近一倍的性能提升,測試過程文檔(請參考我的另外一篇文章):ES優(yōu)化實戰(zhàn)- forceMerge搜索提升測試報告_es forcemerge_水的精神的博客-CSDN博客
? 注意,這次測試,只是這對一個長文本字段(就像一篇文章)的檢索測試。假如同時對多個字段做檢索,帶來的性能會好更多!
? 時間已經(jīng)過去了許久,對檢索的原理,對es集群的理解也有了更高的層次。再寫一篇文章,來講講為什么會性能提升。講講段合并的適用場景,以及需要注意的事項。用的好了性能提升很多,用的不好,性能反而降低很多。
能夠提升的原理
在 Elasticsearch 中,Lucene 索引被分為多個段(segments)以提高查詢性能。每個段都是一個完整的 Lucene 索引,包含一部分?jǐn)?shù)據(jù)。當(dāng)一個文檔被添加到索引中時,它會被添加到一個新的段中。這些新的段需要合并到更大的段中,以便更快地執(zhí)行搜索操作。
forceMerge 是 Elasticsearch 提供的一個 API,可以將多個段合并成一個更大的段。這個過程可以通過減少段數(shù)來提高性能,因為文章來源:http://www.zghlxwxcb.cn/news/detail-759796.html
- 更少的段意味著更少的搜索和查詢操作需要執(zhí)行。
- 這可以減少內(nèi)存使用
- 因為段其實就是底層的一個個小文件。將小文件合并成大文件,毋庸置疑的是,去IO 1個G的一個文件,和IO將拆分每個10M的小文件,用的時間肯定是不一樣的。IO一個大文件速度會更快一些。
- 并減少查詢所需的磁盤 I/O 操作次數(shù)。
- 根據(jù)lucene的檢索原理,默認(rèn),lucene在段中的檢索,是單線程的。大體的流程是,串性在每個段中執(zhí)行檢索,然后再做結(jié)果的reduce合并。假如將所有的段合并成一個段,那么檢索起來,至少在一個分片中。是不用做數(shù)據(jù)合并的。
當(dāng) Elasticsearch 需要執(zhí)行搜索時,它必須在所有分片的所有段上執(zhí)行查詢。如果分片中包含大量小段,則需要執(zhí)行的查詢次數(shù)將非常多,從而導(dǎo)致搜索性能下降。如果使用 forceMerge 將這些小段合并為更大的段,則查詢次數(shù)將減少,并且查詢性能將得到顯著提高。文章來源地址http://www.zghlxwxcb.cn/news/detail-759796.html
forceMerge注意事項
- 但是,需要注意的是,forceMerge 操作是一項資源密集型操作,會消耗大量的 CPU、磁盤和內(nèi)存資源。這也是為什么官方默認(rèn)只給一個merge線程。這個過程一定會影響到查詢的性能,寫入的性能。
- 此外,forceMerge 過程中,需要花費一倍的磁盤空間??梢院唵蔚乃鼤r間上就像是一個reindex過程,在reindex完成之前,你的集群中存放的數(shù)據(jù)它就一定是雙倍的。只有等合并完成,它才會將原來的刪掉。因為它將多個段合并為一個更大的段。這可能會對磁盤空間產(chǎn)生影響,因此需要確保有足夠的磁盤空間可供使用。
- 一定一定要注意。這項操作,建議只對不變更的數(shù)據(jù)做merge成一個段的操作。因為假如何合并完成后,再有更新,或者新寫入,仍然會產(chǎn)生很多新的段。這會讓檢索性能降低很多。因為forceMerge 是一個強制的操作。但是新加進來的段,根據(jù)合并策略,它是沒有辦法和原來的段合并的!
到了這里,關(guān)于ES forceMerge 強制段合并為什么會提升檢索性能?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!