作者:靠髮型吃飯的柳樹 來自:柳樹的絮叨叨
Elasticsearch是什麼?
Elasticsearch is the distributed search and analytics engine at the heart of the Elastic Stack.
簡單說,就是一個分佈式的搜索與分析引擎。
為什麼需要 Elasticsearch?
用數據庫,也可以實現搜索的功能,為什麼還需要搜索引擎呢?
就像 Stackoverflow 的網友說的:
A relational database can store data and also index it. A search engine can index data but also store it.
數據庫(理論上來講,ES 也是數據庫,這裡的數據庫,指的是關係型數據庫),首先是存儲,搜索只是順便提供的功能,
而搜索引擎,首先是搜索,但是不把數據存下來就搜不了,所以只好存一存。
術業有專攻,專攻搜索的搜索引擎,自然會提供更強大的搜索能力。
1、精確匹配和相關性匹配
在使用數據庫搜索時,我們更多的是基於「精確匹配」的搜索。
什麼是「精確匹配」?
比如搜訂單,根據訂單狀態,準確搜索。搜「已完成」,就要「精確匹配」「已完成」的訂單,搜「待支付」,就要「精確匹配」「待支付」的訂單。
這種「精確匹配」的搜索能力,傳統關係型數據庫是非常勝任的。
和「精確匹配」相比,「相關性匹配」更貼近人的思維方式。
比如我要搜一門講過「莎士比亞」的課程,我需要在課程的文稿裡進行「相關性匹配」,找到對應的文稿,
你可能覺得一條 sql 語句就可以解決這個問題:
select * from course where content like "%莎士比亞%"
然而,這隻能算是「模糊查詢」,用你要搜索的字符串,去「精確」的「模糊查詢」,其實還是「精確匹配」,機械思維。
那麼到底什麼是「相關性匹配」,什麼才是「人的思維」呢?
比如我搜「莎士比亞」,我要的肯定不只是精精確確包含「莎士比亞」的文稿,我可能還要搜「莎翁」、「Shakespeare」、「哈姆雷特」、「羅密歐和朱麗葉」、「威尼斯的商人」…
又比如我輸錯了,輸成「莎士筆亞」,「相關性匹配」可以智能的幫我優化為「莎士比亞」,返回對應的搜索結果。
這就是搜索引擎的強大之處,它似乎可以理解你的真實意圖。
2、搜索和分析,不只是搜索,還有分析
"search and analytics engine",ES 不僅是搜索,還有分析。
原始數據如果只是躺在磁盤裡面根本就毫無用處。—— 《Elasticsearch 權威指南》
躺在磁盤裡的數據是沒有價值的,而ES則讓你存放在裡面的數據,擁有了無限的探索力。
Elasticsearch 真正強大之處在於可以從無規律的數據中找出有意義的信息 —— 從“大數據”到“大信息”。—— 《Elasticsearch 權威指南》
和 mysql 一樣,ES 提供了一些簡單的聚合操作,avg、sum、min、max等等。
當然,實際的業務場景,很多是無法通過這些聚合操作就能分析出想要的數據的,複雜的處理邏輯,還是要通過寫業務代碼來實現。
實時計算的一種常見方案,是數據產生後,通過消息隊列(比如kafka)推給實時計算平臺 storm,計算後,再把數據存到 ES。
貌似es在這裡沒有提供什麼分析能力,然而只要數據存在於es,這些數據的被探索力就比放在數據庫裡的強,你隨時可以在裡面挖掘出商機。
令我最為震驚的是,他們竟然不看表面數據,而是從無限數據的機會中尋找核心數據。 這正體現了大數據與傳統數據之間最大的不同。以前,我們是“有問題找數據”,而在大數據時代,其最核心的特質則是“用數據找機會” —— 《決戰大數據》車品覺
這一切的分析數據的能力,都是建立在快速的查詢上的,如果沒有快速的查詢,分析能力無從談起。
簡單看看 Elasticsearch 的內幕
最後簡單聊聊 ES 的內部原理。
正如上文講到的,術業有專攻,既然 ES 是專門做搜索的,內部實現細節自然和主要做存儲的數據庫不同。
關係型數據庫,把原本非常形象的對象,拍平了,拍成各個字段,存在數據庫,查詢時,再重新構造出對象;ES則是文檔存儲,把對象原原本本地放進去,取出時直接取出。
Mysql基於B+樹索引,來實現快速檢索,ES則基於倒排索引,對於文檔搜索來說,倒排索引在性能和空間上都有更加明顯的優勢。
倒排索引很複雜,下次再講。
閱讀更多 Java技術架構 的文章