Elasticsearch,分佈式,高性能,高可用,可伸縮的搜索和分析系統java
基本等於沒說,我們慢慢看算法
百度:咱們好比說想找尋任何的信息的時候,就會上百度去搜索一下,好比說找一部本身喜歡的電影,或者說找一本喜歡的書,或者找一條感興趣的新聞(提到搜索的第一印象)
百度 != 搜索,這是不對的數據庫
搜索,就是在任何場景下,找尋你想要的信息,這個時候,會輸入一段你要搜索的關鍵字,而後就指望找到這個關鍵字相關的有些信息segmentfault
數據都是存儲在數據庫裏面的
很天然的,若是從技術的角度去考慮,如何實現搜索,電商網站內部的搜索功能的話,就能夠考慮,去使用數據庫去進行搜索。數據結構
數據庫來處理的話,不考慮數據庫的全文索引什麼的,假如商品有 1000萬 個,那麼基本上就要查找 1000 萬次,且每次都須要加載商品的名稱字段的整段字符串,並挨個尋找。
app
好比「商品描述」字段的長度,有長達數千個,甚至數萬個字符,這個時候,每次都要對每條記錄的全部文本進行掃描,懶判斷說,你包不包含我指定的這個關鍵詞(好比說「牙膏」)elasticsearch
儘量去搜索更多的符合你的指望的結果,好比輸入「生化機」,就搜索不出來「生化危機」分佈式
用數據庫來實現搜索,是不太靠譜的。一般來講,性能會不好的。工具
(有多是手抖打錯了,原本是生化危機),可是指望須要出來右側的 4條 記錄性能
有 4條 數據
將每條數據進行詞條拆分。如「生化危機電影」拆成:生化、危機、電影 關鍵詞(拆分結果與策略算法有關)
每一個關鍵詞將對應包含此關鍵詞的數據 ID
搜索的時候,直接匹配這些關鍵詞,就能拿到包含關鍵詞的數據
這個過程就叫作全文檢索。而詞條拆分和詞條對應的 ID 這個就是倒排索引的的基本原理
數據庫裏的數據,共有100萬條,按照以前的思路,其實就要掃描100萬次,並且每次掃描,都須要匹配那個文本全部的字符,確認是否包含搜索的關鍵詞,並且還不能將搜索詞拆解開來進行檢索
進行搜索的話,假設100萬條數據,拆分出來的詞語,假設有1000萬個詞語,那麼在倒排索引中,就有1000萬行,咱們可能並不須要搜索1000萬次。
極可能說,在搜索到第一次的時候,咱們就能夠找到這個搜索詞對應的數據。
也多是第100次,或者第1000次
就是一個jar包,裏面包含了封裝好的各類創建倒排索引,以及進行搜索的代碼,包括各類算法
java開發的時候,引入lucene jar,而後基於lucene的API進行去進行開發就能夠了
用lucene,咱們就能夠去將已有的數據創建索引,lucene會在本地磁盤上面,給咱們組織索引的數據結構
另外的話,咱們也能夠用lucene提供的一些功能和API來針對磁盤上額
咱們可使用 lucene 開發搜索服務,部署在一臺機器上面,可是沒法解決當數據量增大的時候出現的問題(圖上右側)。
那麼 elasticsearch 就是解決這種場景的工具;
本文由博客一文多發平臺 OpenWrite 發佈!