ElasticSearch核心概念

簡介

Elasticsearch 是一個分佈式可擴展的實時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene™ 基礎上的搜索引擎.當然 Elasticsearch 並不僅僅是 Lucene 那麼簡單,它不僅包括瞭全文搜索功能,還可以進行以下工作:

  • 分佈式實時文件存儲,並將每一個字段都編入索引,使其可以被搜索。
  • 實時分析的分佈式搜索引擎。
  • 可以擴展到上百臺服務器,處理PB級別的結構化或非結構化數據。

核心概念

以下為ES和Mysql等的對照關系

Relational DB Elasticsearch
數據庫(database) 索引(indices)
表(tables) types
行(rows) documents
字段(columns) fields

文檔

就是類似關系型數據庫的一行行的記錄

elasticsearch是面向文檔的,那麼就意味著索弓和搜索數據的最小單位是文檔。

elasticsearch中,文檔有幾個重要屬性:

  • 自我包含, 一篇文檔同時包含字段和對應的值,也就是同時包含key:value !
  • 可以是層次型的
  • 靈活的結構,文檔不依賴預先定義的模式,我們知道關系型數據庫中,要提前定義字段才能使用,在elasticsearch中,對於字段是非常靈活的,有時候,我們可以忽略該字段,或者動態的添加一個新的字段。

盡管我們可以隨意的新增或者忽略某個字段,但是,每個字段的類型非常重要,比如一一個年齡字段類型,可以是字符串也可以是整形。因為elasticsearch會保存字段和類型之間的映射及其他的設置。這種映射具體到每個映射的每種類型,這也是為什麼在elasticsearch中,類型有時候也稱為映射類型。

類型

ES7之後Type被舍棄

類型是文檔的邏輯容器,就像關系型數據庫中的一樣。
類型中對於字段的定義稱為映射,比如name映射為字符串類型。

我們說文檔是無模式的 ,它們不需要擁有映射中所定義的所有字段。

但是如果要新增一個字段,那麼elasticsearch的流程是什麼?

elasticsearch會自動的將新字段加入映射,但是這個字段的不確定它是什麼類型, elasticsearch就開始猜,如果這個值是18 ,那麼elasticsearch會認為它是整形。但是elasticsearch也可能猜不對 ,所以最安全的方式就是提前定義好所需要的映射,這點跟關系型數據庫殊途同歸瞭,先定義好字段,然後再使用。

索引

可以淺顯的理解為就是數據庫

索引是映射類型的容器, elasticsearch中的索引是一個非常大的文檔集合。索引存儲瞭映射類型的字段和其他設置。然後它們被存儲到瞭各個分片上。

節點

Node為集群中的單臺節點,其可以為master節點亦可為slave節點(節點屬性由集群內部選舉得出)並提供存儲相關數據的功能

分片

在es中,默認一個Es就是一個集群,一個集群又至少有一個節點。而一個節點就是一個es進程,節點可以有多個默認索引,如果你創建新索引,那麼索引將會由5個分片( primary shard ,又稱主分片)構成,每一個主分片會有一個副本( replica shard ,又稱復制分片)
分片有兩種類型:primary主片和replica副本,primary用於文檔存儲,Replica shard是Primary Shard的副本,用於冗餘數據及提高搜索性能。

在這裡插入圖片描述

上圖是一個有3個節點的集群,可以看到主分片和對應的復制分片都不會在同一個節點內,這樣有利於某個節點掛掉瞭,數據也不至於丟失。
實際上, 一個分片是一個Lucene索引, 一個包含倒排索引的文件目錄,倒排索引的結構使得elasticsearch在不掃描全部文檔的情況下,就能告訴你哪些文檔包含特定的關鍵字

倒排索引

elasticsearch使用的是一種稱為倒排索引的結構,采用Lucene倒排索作為底層。這種結構適用於快速的全文搜索,一個索引由文檔中所有不重復的列表構成,對於每一個詞,都有一個包含它的文檔列表。 例如,現在有兩個文檔,每個文檔包含如下內容:

Study every day, good good up to forever  # 文檔1包含的內容
To forever, study every day,good good up  # 文檔2包含的內容

為為創建倒排索引,我們首先要將每個文檔拆分成獨立的詞(或稱為詞條或者tokens) ,然後創建一個包含所有不重復的詞條的排序列表,然後列出每個詞條出現在哪個文檔:

在這裡插入圖片描述

現在,我們試圖搜索 to forever,隻需要查看包含每個詞條的文檔

在這裡插入圖片描述

兩個文檔都匹配,但是第一個文檔比第二個匹配程度更高。如果沒有別的條件,現在,這兩個包含關鍵字的文檔都將返回。

再來看一個示例,比如我們通過博客標簽來搜索博客文章。那麼倒排索引列表就是這樣的一個結構:

博客文章(原始數據) 博客文章(原始數據) 索引列表(倒排索引) 索引列表(倒排索引)
博客文章ID 標簽 標簽 博客文章ID
1 python python 1,2,3
2 python linux 3,4
3 linux,python    
4 linux

如果要搜索含有python標簽的文章,那相對於查找所有原始數據而言,查找倒排索引後的數據將會快的多。隻需要查看標簽這一欄,然後獲取相關的文章ID即可。完全過濾掉無關的所有數據,提高效率!

elasticsearch的索引和Lucene的索引對比
在elasticsearch中,索引(庫)這個詞被頻繁使用,這就是術語的使用。在elasticsearch中 ,索引被分為多個分片,每份分片是一個Lucene的索引。所以一個elasticsearch索引是由多 個Lucene索引組成的。

到此這篇關於ElasticSearch簡介的文章就介紹到這瞭,更多相關ElasticSearch簡介內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: