12.04 為什麼需要 Elasticsearch?

作者:靠髮型吃飯的柳樹 來自:柳樹的絮叨叨

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則基於倒排索引,對於文檔搜索來說,倒排索引在性能和空間上都有更加明顯的優勢。

倒排索引很複雜,下次再講。


分享到:


相關文章: