學習Elasticsearch原理筆記

Elasticsearch是一個分佈式可拓展的實時搜索和分析引擎java

文件存儲:Elasticsearch,面向文檔型數據庫,一條數據就是一個文檔,用JSON做爲文檔序列化的格式算法

MySQL和Elasticsearch數據關係術語對比:數據庫

  關係數據庫-數據庫-表-行-列數組

  Elasticsearch-索引-類型-文檔-字段數據結構

Elasticsearch的交互:可使用Java API,也能夠直接使用HTTP的Restful API方式分佈式

Elasticsearch強大的索引能力:精髓-一切設計都是爲了提升搜索的性能post

什麼是倒排索引?舉個例子性能

| ID | Name | Age | Sex | spa

| - - |:-------:| -----:| -----:|設計

| 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,從而減小沒必要要的磁盤讀次數

相關文章
相關標籤/搜索