公司技術棧用到了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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章