這是我參與更文挑戰的第10天,活動詳情查看:更文挑戰html
本篇會主要介紹一些關於 Elasticsearch 的基本概念以及 DSL 是什麼。node
Elasticsearch 是一個能提供近實時查詢的搜索服務引擎,這意味着從索引文檔到真正可搜索之間會有一個輕微的延遲(大概在一秒內)。後面的系列文章咱們會談到關於 ES 的數據搜索(或者叫讀取)原理以及持久化原理,均與內存的刷新寫入有關,這裏咱們只須要先知道大概會有一秒的延遲,而且在代理能夠實現強制刷新就能夠了。數據庫
要解釋倒排索引呢,就須要先了解一下分詞。分詞 顧名思義,做爲一個動詞,就是分解成詞語,根據不一樣的規則,分詞的結果也不盡相同。好比咱們常用的中文分詞插件 ik
分詞:數組
ik_max_word: 會將文本作最細粒度的拆分,好比會將「中華人民共和國國歌」拆分爲「中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌」,會窮盡各類可能的組合,適合 Term Query;安全
ik_smart: 會作最粗粒度的拆分,好比會將「中華人民共和國國歌」拆分爲「中華人民共和國,國歌」,適合 Phrase 查詢。服務器
可見,根據查詢的目標不一樣,咱們也須要來調整不一樣的分詞模式。分詞大概就是這樣。markdown
倒排索引:好比咱們要根據一些關鍵詞來檢索一些文章,首先咱們會對全部的文章進行編碼,也能夠說是標記頁碼,倒排索引至關於建立了關鍵詞(分詞結果)目錄,記錄了哪一個單詞被哪些文章包含,以下:數據結構
關鍵詞 | 頁碼 |
---|---|
運動 | 1,2,3,5,7,8 |
活動 | 3,4 |
生命 | 1,2 |
chenqionghe | 8 |
當咱們要搜索找到有「運動」的文章時,先去關鍵詞目錄找,找到在1,2,3,5,7,8這幾頁,而後直接把書翻到這些頁就能獲取到相應的內容了。若是咱們要搜索「運動生命」,得先把這個分紅「運動」和「生命」,再分別去目錄找(所以怎麼分詞,也是搜索引擎中的一大藝術)。dom
倒排索引的原理其實就這麼簡單(其實沒這麼簡單,能夠先這麼理解)。elasticsearch
文檔(document) :Elasticsearch是面向文檔(document oriented)的,這意味着它能夠存儲整個對象或文檔(document)。然而它不只僅是存儲,還會索引(index)每一個文檔的內容使之能夠被搜索。在Elasticsearch中,你能夠對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。 Elasticsearch 使用 Javascript 對象符號(JavaScript Object Notation),也就是JSON,做爲文檔序列化格式。一般,咱們能夠認爲對象(object)和文檔(document)是等價相通的。不過,他們仍是有所差異: 對象(Object)是一個JSON結構體——相似於哈希、hashmap、字典或者關聯數組;對象(Object)中還可能包含其餘對象(Object)。 在Elasticsearch中,文檔(document)這個術語有着特殊含義。它特指最頂層結構或者根對象(root object)序列化成的JSON數據(以惟一ID標識並存儲於Elasticsearch中)。
索引:在 Elasticsearch 中存儲數據的行爲就叫作索引(indexing)。在 Elasticsearch 中,文檔歸屬於一種類型 (type),而這些類型存在於索引(index)中,咱們能夠畫一些簡單的對比圖來類比傳統關係型數據庫:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
複製代碼
Elasticsearch集羣能夠包含多個索引(indices)(數據庫),每個索引能夠包含多個類型(types)(表),每個類型包含多個文檔(documents)(行),而後每一個文檔包含多個字段(Fields)(列)。
「索引」含義的區分
你可能已經注意到索引(index)這個詞在Elasticsearch中有着不一樣的含義,因此有必要在此作一下區分:
- 索引(名詞) 如上文所述,一個索引(index)就像是傳統關係數據庫中的數據庫,它是相關文檔存儲的地方,index的複數是indices 或indexes。
- 索引(動詞) 「索引一個文檔」表示把一個文檔存儲到索引(名詞)裏,以便它能夠被檢索或者查詢。這很像SQL中的INSERT關鍵字,差異是,若是文檔已經存在,新的文檔將覆蓋舊的文檔。
- 倒排索引 傳統數據庫爲特定列增長一個索引,例如B-Tree索引來加速檢索。Elasticsearch和Lucene使用一種叫作倒排索引(inverted index)的數據結構來達到相同目的。
類型:6.0 以前的版本用來區分同一索引下的不一樣類型。在 6.0 的時候,已經默認只能支持一個索引一個 type 了,7.0 版本新增了一個參數 include_type_name
,即讓全部的 API 是 type 相關的,這個參數在 7.0 默認是 true,不過在 8.0 的時候,會默認改爲 false,也就是不包含 type 信息了,這個是 type 用於移除的一個開關。也就是說,對比圖最後會更新成以下:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> <無對應> -> Indices -> Documents -> Fields
複製代碼
節點(node)是一個運行着的 Elasticsearch 實例,你能夠認爲是單個服務器。集羣(cluster)是一個或多個節點的集合,他們協同工做,共享數據並提供故障轉移和擴展功能。實現整個 Elasticsearch 服務的高可用。
理論上,索引能夠存儲儘量多的數據,可是這種狀況下性能每每不太樂觀,或者常見的磁盤容量限制也不能容許。因此 Elasticsearch 提供了相似於 MongoDB 中的分片功能,該功能能將索引細分爲多個分片。每一個分片自己是一個功能徹底和獨立的「索引」,能夠託管在集羣中的任何節點上。
一樣的,有分片技術來處理數據量增加快速的問題,就意味着須要複製技術來應對這種過程當中(其實不僅是該過程,任何狀況下都應該有安全意識)數據安全的問題。Elasticsearch 容許您將索引分片的一個或多個副本轉換爲所謂的副本分片。複製技術爲咱們提供了數據的高可用性和搜索吞吐的擴展性。不過須要注意的是,副本分片從不分配在與從其複製的原始/主分片相同的節點上。
總而言之,每一個索引能夠拆分爲多個分片。索引也能夠複製爲零(意味着沒有副本)或更屢次。一旦複製,每一個索引將具備主分片(從索引複製的原始分片)和副本分片(主分片的副本)。開發者能夠在建立索引時就爲每一個索引定義分片和副本的數量。建立索引後,能夠隨時動態更改副本數,但不能在此過程後隨即更改分片數。
領域特定語言(英語:domain-specific language、DSL)指的是專一於某個應用程序領域的計算機語言。又譯做領域專用語言。而這裏咱們說到的即是關於 Elasticsearch 的專用語言。這些專用語言通常會用於直接訪問 ES 而非經過好比 Java 客戶端這種調用接口的方式來操做 ES 數據。DSL 並非本系列的重點,這裏咱們就先不作更多描述和介紹了,你們能夠參照 Quick Start 文檔來作一些練習。
本篇咱們簡單介紹了一些關於 Elasticsearch 的基本概念和 DSL 語言是什麼。下一篇咱們會開始搭建項目並逐漸介紹 Elasticsearch 的一些底層原理。