大家可能會(huì)遇到索引數(shù)據(jù)比較慢的過(guò)程漩氨。其實(shí)明白索引的原理就可以有針對(duì)性的進(jìn)行優(yōu)化西壮。ES索引的過(guò)程到相對(duì)Lucene的索引過(guò)程多了分布式數(shù)據(jù)的擴(kuò)展,而這ES主要是用tranlog進(jìn)行各節(jié)點(diǎn)之間的數(shù)據(jù)平衡叫惊。所以從上我可以通過(guò)索引的settings進(jìn)行第一優(yōu)化:
"index.translog.flush_threshold_ops":"10000" "refresh_interval" : "1s"
這兩個(gè)參數(shù)第一是到translog數(shù)據(jù)達(dá)到多少條進(jìn)行平衡茸时,默認(rèn)為5000,而這個(gè)過(guò)程相對(duì)而言是比較浪費(fèi)時(shí)間和資源的赋访。所以我們可以將這個(gè)值調(diào)大一些還是設(shè)為-1關(guān)閉可都,進(jìn)而手動(dòng)進(jìn)行translog平衡。第二參數(shù)是刷新頻率蚓耽,默認(rèn)為1s是指索引在生命周期內(nèi)定時(shí)刷新渠牲,一但有數(shù)據(jù)進(jìn)來(lái)能refresh像lucene里面commit,我們知道當(dāng)數(shù)據(jù)addDoucment后,還不能檢索到要commit之后才能行數(shù)據(jù)的檢索步悠,所以可以將其關(guān)閉签杈,在最初索引完后手動(dòng)refresh之,然后將索引setting里面的index.refresh_interval參數(shù)按需求進(jìn)行修改,從而可以提高索引過(guò)程效率答姥。
另外的知道ES索引過(guò)程中如果有副本存在铣除,數(shù)據(jù)也會(huì)馬上同步到副本中去。我個(gè)人建議在索引過(guò)程中將副本數(shù)設(shè)為0鹦付,待索引完成后將副本數(shù)按需量改回來(lái)尚粘,這樣也可以提高索引效率。
“number_of_replicas”: 0
其實(shí)檢索速度快度與索引質(zhì)量有很大的關(guān)系敲长。而索引質(zhì)量的好壞主要與以下幾方面有關(guān):
分片數(shù)
分片數(shù)是與檢索速度非常相關(guān)的的指標(biāo)郎嫁,如果分片數(shù)過(guò)少或過(guò)多都會(huì)導(dǎo)致檢索比較慢。分片數(shù)過(guò)多會(huì)導(dǎo)致檢索時(shí)打開(kāi)比較多的文件別外也會(huì)導(dǎo)致多臺(tái)服務(wù)器之間通訊祈噪。而分片數(shù)過(guò)少會(huì)導(dǎo)致單個(gè)分片索引過(guò)大泽铛,所以檢索速度慢〖穑基于索引分片數(shù)=數(shù)據(jù)總量/單分片數(shù)的計(jì)算公式盔腔,在確定分片數(shù)之前需要進(jìn)行單服務(wù)單索引單分片的測(cè)試,目前我們測(cè)試的結(jié)果單個(gè)分片的內(nèi)容為10G月褥。
分片(Shard):一個(gè)索引會(huì)分成多個(gè)分片存儲(chǔ)弛随,分片數(shù)量在索引建立后不可更改,推薦【分片數(shù)*副本數(shù)=集群數(shù)量】
確定分片(shard)的數(shù)量和副本(replica)的數(shù)量
ElasticSearch在創(chuàng)建索引數(shù)據(jù)時(shí)吓坚,最好指定相關(guān)的shards數(shù)量和replicas, 否則會(huì)使用服務(wù)器中的默認(rèn)配置參數(shù)shards=5灯荧,replicas=1
礁击。
因?yàn)檫@兩個(gè)屬性的設(shè)置直接影響集群中索引和搜索操作的執(zhí)行。假設(shè)你有足夠的機(jī)器來(lái)持有碎片和副本逗载,那么可以按如下規(guī)則設(shè)置這兩個(gè)值:
1) 擁有更多的碎片可以提升索引執(zhí)行能力哆窿,并允許通過(guò)機(jī)器分發(fā)一個(gè)大型的索引;
2) 擁有更多的副本能夠提升搜索執(zhí)行能力以及集群能力厉斟。
對(duì)于一個(gè)索引來(lái)說(shuō)挚躯,number_of_shards只能設(shè)置一次,而number_of_replicas可以使用索引更新設(shè)置API在任何時(shí)候被增加或者減少擦秽。
這兩個(gè)配置參數(shù)在配置文件的配置如下:
index.number_of_shards: 5 number_of_replicas: 1
Elastic官方文檔建議:一個(gè)Node中一個(gè)索引最好不要多于三個(gè)shards.配置total_shards_per_node參數(shù)码荔,限制每個(gè)index每個(gè)節(jié)點(diǎn)最多分配多少個(gè)發(fā)片.
http://www.open-open.com/doc/view/f240d61f8f7745098b4459c2483feb40
副本數(shù)
副本數(shù)與索引的穩(wěn)定性有比較大的關(guān)系,如果Node在非正常掛了感挥,經(jīng)常會(huì)導(dǎo)致分片丟失缩搅,為了保證這些數(shù)據(jù)的完整性,可以通過(guò)副本來(lái)解決這個(gè)問(wèn)題触幼。建議在建完索引后在執(zhí)行Optimize后硼瓣,馬上將副本數(shù)調(diào)整過(guò)來(lái)。
分詞
分詞對(duì)于索引的影響可大可小置谦,看自己把握堂鲤。大家或許認(rèn)為詞庫(kù)越多亿傅,分詞效果越好,索引質(zhì)量越好瘟栖,其實(shí)不然葵擎。分詞有很多算法,大部分基于詞表進(jìn)行分詞慢宗。也就是說(shuō)詞表的大小決定索引大小坪蚁。所以分詞與索引膨漲率有直接關(guān)系。詞表不應(yīng)很多镜沽,而對(duì)文檔相關(guān)特征性較強(qiáng)的即可敏晤。比如論文的數(shù)據(jù)進(jìn)行建索引,分詞的詞表與論文的特征越相似缅茉,詞表數(shù)量越小嘴脾,在保證查全查準(zhǔn)的情況下,索引的大小可以減少很多蔬墩。索引大小減少了译打,那么檢索速度也就提高了。
索引段
索引段即lucene中的segments概念拇颅,我們知道ES索引過(guò)程中會(huì)refresh和tranlog也就是說(shuō)我們?cè)谒饕^(guò)程中segments number不只一個(gè)奏司。而segments number與檢索是有直接聯(lián)系的,segments number越多檢索越慢樟插,而將segments numbers 有可能的情況下保證為1韵洋,這將可以提高將近一半的檢索速度。
https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html
未完待續(xù)