ElasticSearch是性能優(yōu)化的分布式全文搜索引擎,存儲數(shù)據(jù)的載體是文檔(Document),它的優(yōu)勢在于搜索速度快和支持聚合操作,在更新文檔時,基本上能夠達(dá)到實(shí)時搜索。ElasticSearch引擎總是按照文檔標(biāo)識來更新數(shù)據(jù),并發(fā)控制是通過順序的版本ID(version)實(shí)現(xiàn)的,控制寫-寫、寫-讀沖突,實(shí)現(xiàn)數(shù)據(jù)弱一致性。

在ElasticSearch引擎中,索引定義了文檔的邏輯存儲,索引是由段(Segment)組成的,段不是實(shí)時更新的,這意味著,在建立索引時,一個段寫入磁盤后,就不再被更新。被刪除文檔的信息存儲在一個單獨(dú)的文件中,在搜索數(shù)據(jù)時,ElasticSearch首先從段中查詢,再從查詢結(jié)果中過濾被刪除的文檔,這意味著,段中存儲”未被刪除文檔“的密度降低。多個段可以通過段合并(Segment Merge)操作把“已刪除”的文檔將從段中物理刪除,將未刪除的文檔合并成一個新段,新段中沒有”已刪除文檔“,因此,段合并操作能夠提高索引的查找速度,但段合并是IO密集型的,需要消耗大量的IO操作。

一旦數(shù)據(jù)存儲在倒排索引中,就不能被修改,因此,更新文檔是一項(xiàng)復(fù)雜的任務(wù)。在內(nèi)部,ElasticSearch引擎必須首先獲取文檔(從_source屬性中獲得數(shù)據(jù)),刪除舊的文檔,更新_source屬性,然后重新索引該文檔,使之可被搜索到,就是說,文檔更新的流程,實(shí)際上是先標(biāo)記文檔被刪除,后插入新的文檔,最后將新文檔編入索引。

數(shù)據(jù)的更新,主要是通過_update端點(diǎn),編寫內(nèi)嵌腳本(inline script)來實(shí)現(xiàn)。默認(rèn)的腳本語言是Groovy,Groovy是內(nèi)置的腳本語言,不需要安裝,默認(rèn)是禁用的,在未啟用動態(tài)腳本的結(jié)點(diǎn)上執(zhí)行腳本更新,ElasticSearch引擎將會拋出異常消息:

scripts of type [inline], operation [update] and lang [groovy] are disabled

要啟用腳本更新,必須修改每個節(jié)點(diǎn)(node)的全局配置文件 config/elasticsearch.yml,添加配置選項(xiàng):

script.inline: truescript.indexed: true

一,編入索引(Index Data)

索引API用于將一個類型化的JSON結(jié)構(gòu)添加到一個索引中,或者更新索引中的一個文檔,使之能夠被搜索到。

1,使用文檔標(biāo)識編入索引

在把文檔編入索引時,如果在API中顯式提供文檔的標(biāo)識(_id),那么ElasticSearch引擎使用Upsert(更新或增加)方式更新索引,這意味著,如果索引中已經(jīng)存在相同ID的文檔,那么ElasticSearch更新該文檔(實(shí)際上是先刪除,后添加);如果索引中不存在相同ID的文檔,那么把文檔添加索引中。

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

PUT host:port/twitter/tweet/1 -d 
{    "user" :
        
		

網(wǎng)友評論