一、ES 產生背景
對於一般的公司,初期是沒有那麼多數據的,所以很多公司更傾向於使用傳統的數據庫:mysql;比如我們要查找關鍵字“呀呀呀”,那麼查詢的方式大概就是:select * from table where field like ‘%呀呀呀%’; 但是隨着業務發展,數據會不斷的膨脹,那麼問題就來了;mysql單表查詢能力即便經過了優化,它的極限也就是400W左右的數據量。而且還會經常出現查詢超時的現象;
然後很多公司開始對數據庫進行橫向和縱向的擴容,開始進行數據庫表的“拆分”:橫向拆分和縱向拆分;但是即便這樣操作,仍然會出現很多問題,比如:
1、數據庫會出現單點故障問題,於是先天主從複製關係,於是增加了運維成本.
2、因爲對錶的拆分,增加了後期維護的難度,同樣也是增加了運維成本.
3、即便做了大量的維護,但對於大數據的檢索操作,依然很慢,完全達不到期望值.
所以爲了滿足需求: 海量數據組合條件查詢 、毫秒級或者秒級返回數據,ElasticSearch應運而生。
二、Lucene 定義
lucene是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。官網地址: http://lucene.apache.org/
搜索流程:創建查詢--->執行搜索--->渲染搜索結果。
三、ES 定義
四、ES vs Lucene
五、Solr 定義
六、ES vs Solr 優缺點
七、ES vs Solr
檢索速度:當單純的對已有數據進行搜索時,Solr更快。
八、ES vs 關係型數據庫
索引(Index)
ES將數據存儲於一個或多個索引中,索引是具有類似特性的文檔的集合。類比傳統的關係型數據庫領域來說,索引相當於SQL中的一個數據庫,或者一個數據存儲方案(schema)。索引由其名稱(必須爲全小寫字符)進行標識,並通過引用此名稱完成文檔的創建、搜索、更新及刪除操作。一個ES集羣中可以按需創建任意數目的索引。
類型(Type)
類型是索引內部的邏輯分區(category/partition),然而其意義完全取決於用戶需求。因此,一個索引內部可定義一個或多個類型(type)。一般來說,類型就是爲那些擁有相同的域的文檔做的預定義。例如,在索引中,可以定義一個用於存儲用戶數據的類型,一個存儲日誌數據的類型,以及一個存儲評論數據的類型。類比傳統的關係型數據庫領域來說,類型相當於“表”。
文檔(Document)
文檔是Lucene索引和搜索的原子單位,它是包含了一個或多個域的容器,基於JSON格式進行表示。文檔由一個或多個域組成,每個域擁有一個名字及一個或多個值,有多個值的域通常稱爲“多值域”。每個文檔可以存儲不同的域集,但同一類型下的文檔至應該有某種程度上的相似之處。