1. 程式人生 > 其它 >ElasticSearch—基本概念

ElasticSearch—基本概念

技術標籤:# 資料庫DB

原文作者:阮一峰

原文地址:全文搜尋引擎 Elasticsearch 入門教程

全文搜尋屬於最常見的需求,開源的ElasticSearch(以下簡稱 Elastic)是目前全文搜尋引擎的首選。

它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。

Elastic 的底層是開源庫Lucene。但是,你沒法直接用 Lucene,必須自己寫程式碼去呼叫它的介面。Elastic 是 Lucene 的封裝,提供了 REST API 的操作介面,開箱即用

1. 近實時查詢(Near RealTime)

Elasticsearch 是一個能提供近實時查詢的搜尋服務引擎,這意味著從索引文件到真正可搜尋之間會有一個輕微的延遲(大概在一秒內)

2. Node 與 Cluster

Elastic 本質上是一個分散式資料庫,允許多臺伺服器協同工作,每臺伺服器可以執行多個 Elastic 例項。單個 Elastic 例項稱為一個節點(node)。一組節點構成一個叢集(cluster)。

3.Index

Elastic 會索引所有欄位,經過處理後寫入一個反向索引(Inverted Index)。查詢資料的時候,直接查詢該索引。所以,Elastic 資料管理的頂層單位就叫做 Index(索引),它是單個數據庫的同義詞。每個 Index (即資料庫)的名字必須是小寫。

下面的命令可以檢視當前節點的所有 Index:


$ curl -X GET '
http://localhost
:9200/_cat/indices?v'3..4

4.Document

Index 裡面單條的記錄稱為 Document(文件)。許多條 Document 構成了一個 Index。Document 使用 JSON 格式表示,下面是一個例子。


{
  "user": "張三",
  "title": "工程師",
  "desc": "資料庫管理"
}

同一個 Index 裡面的 Document,不要求有相同的結構(scheme),但是最好保持相同,這樣有利於提高搜尋效率。

5. Type

Document 可以分組,比如weather這個 Index 裡面,可以按城市分組(北京和上海),也可以按氣候分組(晴天和雨天)。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document不同的 Type 應該有相似的結構(schema),舉例來說,id欄位不能在這個組是字串,在另一個組是數值。這是與關係型資料庫的表的一個區別。性質完全不同的資料(比如productslogs)應該存成兩個 Index,而不是一個 Index 裡面的兩個 Type(雖然可以做到)。

下面的命令可以列出每個 Index 所包含的 Type。


$ curl 'localhost:9200/_mapping?pretty=true'

根據規劃,Elastic 6.x 版只允許每個 Index 包含一個 Type,7.x 版將會徹底移除 Type。

6. 分片和複製理

理論上,索引可以儲存儘可能多的資料,但是這種情況下效能往往不太樂觀,或者常見的磁碟容量限制也不能允許。所以 Elasticsearch 提供了類似於 MongoDB 中的分片功能,該功能能將索引細分為多個分片。每個分片本身是一個功能完全和獨立的“索引”,可以託管在叢集中的任何節點上。

同樣的,有分片技術來處理資料量增長快速的問題,就意味著需要複製技術來應對這種過程中資料安全的問題(其實不只是該過程,任何情況下都應該有安全意識)。Elasticsearch 允許您將索引分片的一個或多個副本轉換為所謂的副本分片。複製技術為我們提供了資料的高可用性和搜尋吞吐的擴充套件性。不過需要注意的是,副本分片從不分配在與從其複製的原始/主分片相同的節點上。

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