Elasticsearch 不徹底入門指北系列(二):概念介紹與 DSL

這是我參與更文挑戰的第10天,活動詳情查看:更文挑戰html

本篇會主要介紹一些關於 Elasticsearch 的基本概念以及 DSL 是什麼。node

1. 基本概念

1.1 近實時

Elasticsearch 是一個能提供近實時查詢的搜索服務引擎,這意味着從索引文檔到真正可搜索之間會有一個輕微的延遲(大概在一秒內)。後面的系列文章咱們會談到關於 ES 的數據搜索(或者叫讀取)原理以及持久化原理,均與內存的刷新寫入有關,這裏咱們只須要先知道大概會有一秒的延遲,而且在代理能夠實現強制刷新就能夠了。數據庫

1.2 分詞與倒排索引

要解釋倒排索引呢,就須要先了解一下分詞。分詞 顧名思義,做爲一個動詞,就是分解成詞語,根據不一樣的規則,分詞的結果也不盡相同。好比咱們常用的中文分詞插件 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

1.3 文檔(document)、索引(index)與類型(type)

文檔(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
複製代碼

1.4 節點和集羣

節點(node)是一個運行着的 Elasticsearch 實例,你能夠認爲是單個服務器。集羣(cluster)是一個或多個節點的集合,他們協同工做,共享數據並提供故障轉移和擴展功能。實現整個 Elasticsearch 服務的高可用。

1.5 分片(shards)

理論上,索引能夠存儲儘量多的數據,可是這種狀況下性能每每不太樂觀,或者常見的磁盤容量限制也不能容許。因此 Elasticsearch 提供了相似於 MongoDB 中的分片功能,該功能能將索引細分爲多個分片。每一個分片自己是一個功能徹底和獨立的「索引」,能夠託管在集羣中的任何節點上。

一樣的,有分片技術來處理數據量增加快速的問題,就意味着須要複製技術來應對這種過程當中(其實不僅是該過程,任何狀況下都應該有安全意識)數據安全的問題。Elasticsearch 容許您將索引分片的一個或多個副本轉換爲所謂的副本分片。複製技術爲咱們提供了數據的高可用性和搜索吞吐的擴展性。不過須要注意的是,副本分片從不分配在與從其複製的原始/主分片相同的節點上。

總而言之,每一個索引能夠拆分爲多個分片。索引也能夠複製爲零(意味着沒有副本)或更屢次。一旦複製,每一個索引將具備主分片(從索引複製的原始分片)和副本分片(主分片的副本)。開發者能夠在建立索引時就爲每一個索引定義分片和副本的數量。建立索引後,能夠隨時動態更改副本數,但不能在此過程後隨即更改分片數。

2. DSL 是什麼?

領域特定語言(英語:domain-specific language、DSL)指的是專一於某個應用程序領域的計算機語言。又譯做領域專用語言。而這裏咱們說到的即是關於 Elasticsearch 的專用語言。這些專用語言通常會用於直接訪問 ES 而非經過好比 Java 客戶端這種調用接口的方式來操做 ES 數據。DSL 並非本系列的重點,這裏咱們就先不作更多描述和介紹了,你們能夠參照 Quick Start 文檔來作一些練習。

總結

本篇咱們簡單介紹了一些關於 Elasticsearch 的基本概念和 DSL 語言是什麼。下一篇咱們會開始搭建項目並逐漸介紹 Elasticsearch 的一些底層原理。

連接

相關文章
相關標籤/搜索