公司技術棧用到了Elasticsearch

hfhsdgzsdgsdg發表於2023-02-21

Elasticsearch 是一個分散式、高擴充套件、高實時的搜尋與資料分析引擎。它能很方便的使大量資料具有搜尋、分析和探索的能力。充分利用Elasticsearch的水平伸縮性,能使資料在生產環境變得更有價值。


Elasticsearch 的實現原理主要分為以下幾個步驟,首先使用者將資料提交到Elasticsearch 資料庫中,再透過分詞控制器去將對應的語句分詞,將其權重和分詞結果一併存入資料,當使用者搜尋資料時候,再根據權重將結果排名,打分,再將返回結果呈現給使用者。


Elasticsearch是與名為Logstash的資料收集和日誌解析引擎以及名為Kibana的分析和視覺化平臺一起開發的。這三個產品被設計成一個整合解決方案,稱為“Elastic Stack”(以前稱為“ELK stack”)。被廣泛應用於日誌資料分析,實時監控等領域。


Elasticsearch可以用於搜尋各種檔案。它提供可擴充套件的搜尋,具有接近實時的搜尋,並支援多租戶。Elasticsearch是分散式的,這意味著索引可以被分成分片,每個分片可以有0個或多個副本。每個節點託管一個或多個分片,並充當協調器將操作委託給正確的分片。再平衡和路由是自動完成的。相關資料通常儲存在同一個索引中,該索引由一個或多個主分片和零個或多個複製分片組成。一旦建立了索引,就不能更改主分片的數量。


Lucene是用Java語言寫的一個搜尋引擎類庫,其實就是一個jar包,裡麵包含了搜尋引擎的核心API,在使用的時候只需要匯入這個jar包即可。當然,Lucene是可以擴充套件的,並且是高效能的(倒排索引資料結構,便於查詢)。


Elasticsearch使用Lucene,並試圖透過JSON和Java API提供其所有特性。它支援facetting和percolating,如果新檔案與註冊查詢匹配,這對於通知非常有用。另一個特性稱為“閘道器”,處理索引的長期永續性;例如,在伺服器崩潰的情況下,可以從閘道器恢復索引。Elasticsearch支援實時GET請求,適合作為NoSQL資料儲存,但缺少分散式事務。



倒排索引

Elasticsearch搜尋引擎是基於Lucene的倒排索引實現的,索引的好處就是幫助我們快速檢索到我們想要的資料。


首先先回顧一下正向索引:

一般我們的資料庫表會有id欄位,並且id欄位會被設定為主鍵索引,當我們查詢語句為select * from goods where id = ??? 此時查詢會走索引(底層實現b+樹),因此檢索效率在資料比較多的情況下查詢速度也是比較快的。



但是如果我們查詢title列的每一行資料是否包含“手機”這一欄位時,我們會用到模糊查詢(即使title欄位設定了索引,索引也不會生效)select * from goods where title = %手機%,此時會進行逐行掃描,判斷每一行的title列是否包含“手機”。如果表中的行數比較多,此時逐行掃描所要花費的時間是相當長的,因此查詢效率會顯得非常非常慢!


對於全文檢索的查詢方式,倒排索引可以解決這一難題!


倒排索引用到的術語有:


檔案:表中的每一條記錄(資料)就是一個檔案

詞條:檔案中按照語義劃分成的詞語就是詞條

索引:相同型別的檔案的集合

型別:表示資料結構,相當於表結構中描述欄位的型別

對映:索引中檔案的欄位約束資訊,類似於表的資訊



對於以上的表,無論有多少條檔案,我們都可以根據語義劃分的詞條,形成右邊倒排索引的形式,如果檔案中有重複詞條出現,我們在右邊記錄檔案的id即可。

比如我們作為使用者,想要搜尋華為手機,我們輸入的詞語會被分成“華為”和“手機”兩個詞條,之後會根據詞條列表在倒排索引表中找到包含該詞條的id,會再根據id再次查詢:


倒排索引的過程經過了兩次檢索,首先透過使用者的詞條搜尋檔案id,之後會拿著檔案id去檔案中檢索,找到合適的結果。由於兩次檢索都透過索引進行查詢,所以查詢效率比正向索引效率高很多。

正向索引是基於檔案id查詢詞條,判斷每條檔案是否包含想要的詞條;而倒排索引是透過對所有檔案的內容進行分詞,對詞條建立索引,同時記錄詞條在檔案中的位置。查詢的時候先根據詞條查詢到檔案的id,然後再透過檔案id找到想要的檔案,兩次查詢均走索引。


檔案資料會被序列化為json格式儲存在elasticsearch中,對於我們上面的資料,在elasticsearch中這樣儲存:


根據檔案的型別,相同型別的檔案會被劃分到相同的索引庫中。


所有使用者檔案,就可以組織在一起,稱為使用者的索引;

所有商品的檔案,可以組織在一起,稱為商品的索引;

所有訂單的檔案,可以組織在一起,稱為訂單的索引;



MySQL和Elasticsearch對比

在MySQL中,我們對資料庫實現增刪改查是透過select,delect,update,insert等語句實現的。在Elasticsearch中,是透過DSL語句實現的crud,是一種json風格的請求語法,基於http請求傳送,和語言無關。



MySQL:擅長事務型別(ACID)操作,可以確保資料的安全和一致性;

Elasticsearch:擅長海量資料的搜尋,分析,計算(如商品,頁面搜尋)



Elasticsearch和資料庫的關係為互補關係,資料庫主要負責事務型別操作,Elasticsearch主要負責海量資料的搜尋,分析計算等。


本篇文章就先分享到這裡了,後續會繼續分享其他方面的知識,感謝大佬認真讀完支援咯~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026759/viewspace-2936125/,如需轉載,請註明出處,否則將追究法律責任。

相關文章