隨著各個行業(yè)信息化的快速發(fā)展,當(dāng)今各個垂直領(lǐng)域的數(shù)據(jù)越來越多,而其中有很多數(shù)據(jù)都是無用的,不需特殊處理。如何快速、高效從垂直領(lǐng)域內(nèi)的海量數(shù)據(jù)中檢索、智能挖掘出有用的信息成為現(xiàn)在智能搜索引擎發(fā)展的一大難題。隨著搜索引擎技術(shù)的發(fā)展,出現(xiàn)了各種各樣的搜索引擎技術(shù),但絕大部分搜索引擎技術(shù)針對特殊領(lǐng)域中的特殊術(shù)語和特殊表達方式不能進行有效的檢索和智能推薦,所以傳統(tǒng)的搜索引擎技術(shù)不能滿足當(dāng)前行業(yè)的需求,這就促進了分布式智能搜索引擎的發(fā)展。
分布式智能搜索引擎不僅僅只是根據(jù)各個垂直領(lǐng)域的不同進行自適應(yīng)處理,而且還能在提高檢索精度和檢索效率的基礎(chǔ)上,針對已有的海量數(shù)據(jù)檢索、挖掘出用戶潛在關(guān)注的一些信息,讓搜索引擎能夠提供更加友好、智能的為用戶提供交互。
01
Elasticsearch 基礎(chǔ)概念
Elasticsearch(ES)是一個高度可伸縮的開源全文搜索和分析引擎。它允許以近實時的方式快速存儲、搜索和分析大量的數(shù)據(jù)。Elaticsearch有很好的查詢性能以及強大的查詢語法。在一定場合下可以替代RDBMS做為OLAP的用途。但是其官方查詢語法并不是SQL,而是其獨創(chuàng)的DSL。
近實時:首先,從寫入數(shù)據(jù)到數(shù)據(jù)可以被搜索到有一個小延遲(大概1 秒);其次,執(zhí)行搜索和分析可以達到秒級。
Cluster(集群):集群的每個節(jié)點屬于哪個集群是通過配置(集群名稱,默認(rèn)是elasticsearch)決定的,對于中小型應(yīng)用一個集群通常就一個節(jié)點。
Node(節(jié)點):節(jié)點也有名稱(默認(rèn)是隨機分配的),節(jié)點名稱很重要(在執(zhí)行運維管理操作的時候),默認(rèn)節(jié)點會去加入一個名為“elasticsearch”的集群,如果直接啟動一堆節(jié)點,那么它們會自動組成一個elasticsearch集群,當(dāng)然一個節(jié)點也可以組成一個elasticsearch集群。
Index(索引-數(shù)據(jù)庫):索引包含一堆有相似結(jié)構(gòu)的文檔數(shù)據(jù),比如客戶索引、商品分類索引、訂單索引,索引有一個名稱。一個索引包含很多document,一個索引就代表了一類類似的或者相同的document。
Type(類型-表):每個索引里都可以有一個或多個類型,類型是索引中的一個邏輯數(shù)據(jù)分類,一個類型下的document,都有相同的field。比如博客系統(tǒng),有一個索引,可以定義用戶數(shù)據(jù)type、博客數(shù)據(jù)type、評論數(shù)據(jù)type。
Document(文檔-行):文檔是ES中的最小數(shù)據(jù)單元,一個document可以是一條客戶數(shù)據(jù)、商品分類數(shù)據(jù)或者訂單數(shù)據(jù),通常用JSON數(shù)據(jù)結(jié)構(gòu)表示,每個index下的type中,都可以去存儲多個document。
Field(字段-列):Field是Elasticsearch的最小單位。一個document里面有多個field,每個field就是一個數(shù)據(jù)字段。
mapping(映射-約束):數(shù)據(jù)如何存放到索引對象上,需要有一個映射配置,包括:數(shù)據(jù)類型、是否存儲、是否分詞等。
02
與關(guān)系型數(shù)據(jù)庫(RDBMS)的類比
將ES與關(guān)系型數(shù)據(jù)庫的相應(yīng)字段對比
兩種類型的優(yōu)缺點對比
03
Elasticsearch 作為數(shù)據(jù)庫的特型
無事務(wù):Lucene是ES的構(gòu)建的基礎(chǔ),沒有事務(wù)的概念。ES對于已經(jīng)提交的文檔無法回滾, 使用者也不能提交一組文檔并且為它們?nèi)炕蛞徊糠纸⑺饕?。它具備的是一個用來確保業(yè)務(wù)過程持久性而不用做昂貴的Lucene提交的預(yù)寫日志。也可以指定索引操作的一致性級別,以確保在返回之前有多少副本可以拿來確認(rèn)操作條件。默認(rèn)的是法定人數(shù),例如?n2? 在逐個切片進行處理的方式中,當(dāng)一個索引被刷新時,默認(rèn)是一秒鐘一次,就需要對變更的可見性進行控制。ES追求的是分布式事務(wù)的速度,不支持分布式事務(wù)會使得很多事情變得更容易,只要能接受讀取到的數(shù)據(jù)有些陳舊,而且所有人看到的是同一時間點的數(shù)據(jù),ES就可以利用緩存提供很多服務(wù)。
模式靈活:ES不要求先指定模式,扔給它一個JSON文檔它就會進行一些訓(xùn)練有素的猜測來推斷其類型。對于數(shù)值、布爾、時間戳它可以做的很好。對于字符串,它會使用“標(biāo)準(zhǔn)化”的分析,它是有商榷的“無模式”,在這個意義上不必指定一個模式。為了開發(fā)大規(guī)模的搜索、分析,確實需要對模式進行微調(diào)。ES有大量的強大工具,例如動態(tài)模板、多字段對象等。
關(guān)系和約束:ES更像是一種面向文檔的數(shù)據(jù)庫。想要對搜索的整個對象關(guān)系圖都需要進行索引,在此之前,它們必須先被反規(guī)范化。反規(guī)范化提升了查詢性能(不再需要關(guān)聯(lián)查詢),使用了更多存儲空間(數(shù)據(jù)必須被存儲多次)。但是,要保持?jǐn)?shù)據(jù)一致性和實時性則更加困難(任何數(shù)據(jù)改變都必須被寫入到所有實例中去)。不過,對于一次寫入頻繁讀取的工作場景,它的表現(xiàn)相當(dāng)優(yōu)異。例如,想通過產(chǎn)品名字和客戶姓名來查找數(shù)據(jù)庫中訂單,把客戶和產(chǎn)品的所有必要信息都加進來。這樣查詢就非常簡單,但是當(dāng)改變某個產(chǎn)品的名字時,在規(guī)范化的關(guān)系型模型中,只需要修改該產(chǎn)品對應(yīng)的單條記錄就可以,而在反規(guī)范化的文檔數(shù)據(jù)庫中,將必須更新與該產(chǎn)品有關(guān)的所有訂單。換句話說,在面向文檔類型的數(shù)據(jù)庫中(如ES), 對文檔進行映射和存儲設(shè)計只是為了優(yōu)化查詢和信息獲取的性能。
魯棒性:理想情況下一個耗費資源的查詢應(yīng)當(dāng)可以被撤銷,而不希望數(shù)據(jù)庫停止工作。ES目前并沒有很好的處理Out Of Memory 錯誤。所以,必須給ES配置足夠多的內(nèi)存,而且要謹(jǐn)慎運行那些無法預(yù)知將會耗費多少內(nèi)存的查詢。隨著ES越來越成熟,在不斷追求速度的目標(biāo)下,這個問題會得到改善。
分布式:作為一個分布式的系統(tǒng),ES的上手和使用都很簡單。在一致性、可用性及分區(qū)容錯性方面,ES是一個CP系統(tǒng),如果有一個只讀的工作負(fù)載,ES通過不嚴(yán)格的“最小主節(jié)點”要求(如不需要quorum)實現(xiàn)AP行為。寫入一個配置錯誤的沒有大量節(jié)點的集群,像“split brain”集群,可能引起無法恢復(fù)的數(shù)據(jù)丟失。事實上,在管理成百上千的集群時,??吹街鞴?jié)點選擇問題,因此可以主動將主節(jié)點移入Zoo Keeper。在拓展性方面,索引被分到了一個或多個碎片中,這在索引創(chuàng)建時就指定了且不能改變。因此,隨著數(shù)據(jù)的增長,應(yīng)該合理的分割索引。隨著越來越多的節(jié)點添加到ES集群中來,它在重新分配和移動碎片上表現(xiàn)良好。
安全:ES沒有提供授權(quán)和認(rèn)證特性,只要能連接到ES集群,就擁有了“超級用戶”的權(quán)限,尤其是當(dāng)ES的強大腳本功能被激活時。
04
Elasticsearch 對數(shù)據(jù)的存儲
在系統(tǒng)中使用ES,ES會配置多個路徑:
path.home:運行ES進程的用戶的主目錄。默認(rèn)為Java系統(tǒng)屬性user.dir,它是進程所有者的默認(rèn)主目錄。
path.conf:包含配置文件的目錄。通常通過設(shè)置Java系統(tǒng)屬性es.config來設(shè)置,因為在找到配置文件之前它必然會被解析。
(3)path.plugins:子文件夾為ES插件的目錄。這里支持Sym-links,當(dāng)從同一個可執(zhí)行文件運行多個ES實例時,可用它來有選擇地啟用/禁用某個ES實例的一組插件。
path.logs:存儲生成的日志的位置。如果其中一個卷的磁盤空間不足,則將它放在與數(shù)據(jù)目錄不同的卷上可能是有意義的。
path.data:包含ES存儲的數(shù)據(jù)的文件夾的路徑。
由于Elasticsearch是使用Lucene來處理分片級別的索引和查詢,因此,數(shù)據(jù)目錄文件由ES和Lucene同時處理。兩者的分工如下:
(1)Lucene負(fù)責(zé)對數(shù)據(jù)進行分詞處理,以及存儲與維護索引文件;
(2)ES負(fù)責(zé)編寫與功能相關(guān)的元數(shù)據(jù),例如字段映射,索引設(shè)置和其他集群元數(shù)據(jù)。
05
分析和結(jié)論
關(guān)系型數(shù)據(jù)庫,適合于結(jié)構(gòu)化數(shù)據(jù)存儲和查詢,數(shù)據(jù)查詢默認(rèn)返回所有滿足匹配條件的記錄。如果業(yè)務(wù)數(shù)據(jù)為結(jié)構(gòu)化數(shù)據(jù),同時不需要特別關(guān)注排名和智能分詞模糊匹配查詢等特性,采用關(guān)系型數(shù)據(jù)庫并使用配套搜索引擎。傳統(tǒng)數(shù)據(jù)的多表關(guān)聯(lián)操作,在ES中處理會非常麻煩,因為傳統(tǒng)數(shù)據(jù)庫設(shè)計的初衷在于特定字段的關(guān)鍵詞匹配查詢;而ES倒排索引的設(shè)計更擅長全文檢索。
ES作為NoSQL數(shù)據(jù)庫代表之一,非常適合于非結(jié)構(gòu)化文檔類數(shù)據(jù)存儲、支持智能分詞匹配模糊查詢。ES可以被用作其它數(shù)據(jù)庫的補充,主數(shù)據(jù)庫系統(tǒng)負(fù)責(zé)強大的數(shù)據(jù)約束保證、容錯性和魯棒性、高可用性和帶事務(wù)支持的數(shù)據(jù)更新能力,它維護著核心數(shù)據(jù),這些數(shù)據(jù)隨后會被異步推送到ES中去,在與主數(shù)據(jù)庫保持?jǐn)?shù)據(jù)同步的前提下,使用ES 提供強大的搜索對數(shù)據(jù)進行各種搜索。