Elasticsearch是一個分散式可拓展的實時搜索和分析引擎 文件存儲:Elasticsearch,面向文檔型資料庫,一條數據就是一個文檔,用JSON作為文檔序列化的格式 MySQL和Elasticsearch數據關係術語對比: 關係資料庫-資料庫-表-行-列 Elasticsearch-索引- ...
Elasticsearch是一個分散式可拓展的實時搜索和分析引擎
分散式實時文件存儲,並將每一個欄位都編入索引,使其可以被搜索
實時分析的分散式搜索引擎
可以拓展到上百台伺服器,處理PB級別的結構化或非結構化數據
文件存儲:Elasticsearch,面向文檔型資料庫,一條數據就是一個文檔,用JSON作為文檔序列化的格式
MySQL和Elasticsearch數據關係術語對比:
關係資料庫-資料庫-表-行-列
Elasticsearch-索引-類型-文檔-欄位
Elasticsearch的交互:可以使用Java API,也可以直接使用HTTP的Restful API方式
Elasticsearch強大的索引能力:精髓-一切設計都是為了提高搜索的性能
什麼是倒排索引?舉個例子
| ID | Name | Age | Sex |
| - - |:-------:| -----:| -----:|
| 1 | Kate | 24 | Female
| 2 | John | 24 | Male
| 3 | Bill | 29 | Male
ID是Elasticsearch自建的文檔ID,Name、Age、Sex索引如下:
Name:| Term | Posting List |
| -- |:----:|
| Kate | 1 |
| John | 2 |
| Bill | 3 |
Age:| Term | Posting List |
| -- |:----:|
| 24 | [1,2] |
| 29 | 3 |
Sex:| Term | Posting List |
| -- |:----:|
| Female | 1 |
| Male | [2,3] |
Posting List
Elasticsearch分別為每個field都建立了一個倒排索引,
Kate ,24,Female,John,Male,Bill,29這些是Term。
而1,2,3是文檔ID,[1][3][1,2][2,3]這些就是Posting List。
Posting List就是一個int的數組,存儲了所有符合這個Term的文檔ID。
Term Dictionnary
Elasticsearch將所有的Term排個序,二分法查找Term,logN的查找效率。
Term Index
Term Index是Term Dictionnary的索引,包含的是Term的一些首碼。
Frame Of Reference
Elasticsearch要求Posting List是有序的,方便壓縮。
原理:通過增量,將原來的大數變成小數,僅儲存增量值,再按bit排好隊,最後通過位元組存儲。
Roaring Bitmaps
Bitmap是一種數據結構,假設Posting List[1,3,4,7,10],對應的Bitmap就是[1,0,1,1,0,0,1,0,0,1],非常直觀,用0/1表示某個值是否存在。
Bitmap的缺點是存儲空間隨著文檔個數線性增長。Roaring bitmaps需要用到某些指數特性:將posting list按照65535為界限分塊,用<商,餘數>的組合表示每一組id。
聯合索引
如果多個field索引的聯合查詢,倒排索引如何滿足快速查詢的要求呢?
利用跳錶的數據結構快速做”與“運算,或者利用bitset按位”與“。
Elasticsearch的索引思路:
將磁碟里的東西儘量搬進記憶體,減少磁碟隨機讀取次數(同時也利用磁碟順序讀特性),結合各種壓縮演算法,用極其苛刻的態度使用記憶體。
所以,對於使用Elasticsearch進行索引時需要註意:
不需要索引的欄位,一定要明確定義出來,因為預設是自動建索引的
同樣的道理,對於String類型的欄位,不需要analysis的也需要明確定義出來,因為預設也是會analysis的
選擇有規律的ID很重要,隨機性太大的ID(比如java的UUID)不利於查詢
關於最後一點,個人認為有多個因素:
上面看到的壓縮演算法,都是對Posting list里的大量ID進行壓縮的,那如果ID是順序的,或者是有公共首碼等具有一定規律性的ID,壓縮比會比較高;
最影響查詢性能的,應該是最後通過Posting list里的ID到磁碟中查找Document信息的那步,因為Elasticsearch是分Segment存儲的,Term定位到Segment的效率直接影響了最後查詢的性能,
如果ID是有規律的,可以快速跳過不包含該ID的Segment,從而減少不必要的磁碟讀次數