Elastic搜索引擎的關(guān)系型數(shù)據(jù)處理技巧
在處理非關(guān)系型數(shù)據(jù)存儲(chǔ)引擎Elasticsearch時(shí),由于其與NoSQL數(shù)據(jù)庫(kù)設(shè)計(jì)類型相關(guān),因此在設(shè)計(jì)索引結(jié)構(gòu)時(shí)需要盡可能降低數(shù)據(jù)之間的關(guān)聯(lián)性。本文將介紹Elasticsearch處理關(guān)系型數(shù)據(jù)的四
在處理非關(guān)系型數(shù)據(jù)存儲(chǔ)引擎Elasticsearch時(shí),由于其與NoSQL數(shù)據(jù)庫(kù)設(shè)計(jì)類型相關(guān),因此在設(shè)計(jì)索引結(jié)構(gòu)時(shí)需要盡可能降低數(shù)據(jù)之間的關(guān)聯(lián)性。本文將介紹Elasticsearch處理關(guān)系型數(shù)據(jù)的四種方法。
1. 數(shù)據(jù)冗余的扁平化設(shè)計(jì)
數(shù)據(jù)冗余的扁平化設(shè)計(jì)是一種以空間換取時(shí)間的思想。對(duì)于Elasticsearch而言,為了方便搜索和提高性能,數(shù)據(jù)冗余是常見(jiàn)的處理方式。舉例來(lái)說(shuō),如果一個(gè)公園屬于山西省,則山西省的人可以免費(fèi)游玩;若公園位于山西省太原市,則太原市的居民可享受免費(fèi)入園待遇。通過(guò)在ES索引中創(chuàng)建countyIds字段來(lái)存儲(chǔ)可免費(fèi)游玩的縣ID,實(shí)現(xiàn)數(shù)據(jù)冗余的扁平化設(shè)計(jì)。
2. 嵌套類型(Nested)索引設(shè)計(jì)
嵌套類型索引設(shè)計(jì)能夠較容易地表達(dá)數(shù)據(jù)之間的關(guān)系,但也會(huì)導(dǎo)致查詢性能下降數(shù)倍。當(dāng)一個(gè)學(xué)生可以有多個(gè)老師的情況下,若需同時(shí)搜索學(xué)生和老師信息,可以采用嵌套類型索引設(shè)計(jì),但需注意更新外層對(duì)象時(shí)也要涉及到嵌套對(duì)象的覆蓋。
3. 父子文檔(Join)索引設(shè)計(jì)
Elasticsearch提供了類似關(guān)系型數(shù)據(jù)庫(kù)中Join的實(shí)現(xiàn),即Join數(shù)據(jù)類型。該數(shù)據(jù)類型定義了父子文檔之間的關(guān)系,實(shí)現(xiàn)了兩個(gè)對(duì)象的分離。父子文檔的設(shè)計(jì)中,父文檔和子文檔是獨(dú)立的,更新父文檔無(wú)需重新索引子文檔,子文檔的增刪改不影響其他文檔。雖然父子文檔索引設(shè)計(jì)需要額外內(nèi)存維護(hù)關(guān)系,讀取性能相對(duì)較差,但可避免嵌套類型的弊端。
4. 多個(gè)獨(dú)立的索引之間依靠主外鍵關(guān)聯(lián)
除了Nested和Join類型,也可通過(guò)建立一對(duì)一索引來(lái)處理有關(guān)聯(lián)關(guān)系的數(shù)據(jù)。通過(guò)多次搜索來(lái)實(shí)現(xiàn)關(guān)聯(lián)數(shù)據(jù)查詢,雖然存在多次網(wǎng)絡(luò)連接調(diào)用的缺點(diǎn),但可避免部分性能問(wèn)題。若異常查詢超時(shí)或失敗,整個(gè)接口查詢將受影響。
在總結(jié)與注意事項(xiàng)方面,需要注意以下幾點(diǎn):
1. 在ES 6.0及之后版本,一個(gè)索引中已不能創(chuàng)建多個(gè)type類型的文檔,ES 7.0后type將被廢除。
2. 針對(duì)不同應(yīng)用場(chǎng)景選擇合適的索引結(jié)構(gòu)至關(guān)重要。
3. 不建議創(chuàng)建過(guò)于復(fù)雜的索引接口,這會(huì)增加代碼復(fù)雜度、索引結(jié)構(gòu)擴(kuò)展困難,并提高新同學(xué)的學(xué)習(xí)成本。
通過(guò)本文介紹的處理關(guān)系型數(shù)據(jù)的方法,可以使Elasticsearch更有效地處理各種數(shù)據(jù)關(guān)聯(lián)問(wèn)題,提升系統(tǒng)性能和搜索效率。