Elasticsearch 全教程--入門

1.1 初識

Elasticsearch 是一個創建在全文搜索引擎 Apache Lucene(TM) 基礎上的搜索引擎,能夠說 Lucene 是當今最早進,最高效的全功能開源搜索引擎框架。java

可是 Lucene 只是一個框架,要充分利用它的功能,你須要使用 JAVA,而且在你的程序中集成 Lucene。更糟的是,你須要作不少的學習瞭解,才能明白它是如何運行的,Lucene 確實很是複雜。git

Elasticsearch 使用 Lucene 做爲內部引擎,可是在你使用它作全文搜索時,只須要使用統一開發好的API便可,而並不須要瞭解其背後複雜的 Lucene 的運行原理。github

固然 Elasticsearch 並不只僅是 Lucene 那麼簡單,它不只包括了全文搜索功能,還能夠進行如下工做:數據庫

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

這麼多的功能被集成到一臺服務器上,你能夠輕鬆地經過客戶端或者任何你喜歡的程序語言與 ES 的 RESTful API 進行交流。apache

Elasticsearch 的上手是很是簡單的。它附帶了不少很是合理的默認值,這讓初學者很好地避免一上手就要面對複雜的理論,它安裝好了就可使用了,用很小的學習成本就能夠變得頗有生產力。編程

隨着學習的深刻,你還可使用 Elasticsearch 更多高級的功能,整個引擎能夠很靈活地進行配置。你能夠根據自身需求來定製屬於你本身的 Elasticsearch。json

1.2 安裝

安裝 JAVA
yum install java-1.7.0-openjdk -y 
安裝 Elasticsearch

瞭解 Elasticsearch 最簡單的方法就是去盡情的玩兒它(汗),準備好了咱們就開始吧。api

安裝 Elasticsearch 只有一個要求,就是要安裝最新版本的JAVA。你能夠到官方網站下載它:www.java.com.數組

你能夠在這裏下載到最新版本的 Elasticsearch: elasticsearch.org/download.服務器

curl -L -O http://download.elasticsearch.org/PATH/TO/LATEST/$VERSION.zip unzip elasticsearch-$VERSION.zip cd elasticsearch-$VERSION 

提示: 當你安裝 Elasticsearch 時,你能夠到 下載頁面 選擇Debian或者RP安裝包。或者你也可使用官方提供的 Puppet module 或者 Chef cookbook.

安裝 Marvel
這是個付費的監控插件 暫時先不翻譯

Marvel is a management and monitoring tool for Elasticsearch which is free for development use. It comes with an interactive console called Sense which makes it very easy to talk to Elasticsearch directly from your browser.

Many of the code examples in this book include a ``View in Sense'' link. When clicked, it will open up a working example of the code in the Sense console. You do not have to install Marvel, but it will make this book much more interactive by allowing you to experiment with the code samples on your local Elasticsearch cluster.

Marvel is available as a plugin. To download and install it, run this command in the Elasticsearch directory:

./bin/plugin -i elasticsearch/marvel/latest

You probably don't want Marvel to monitor your local cluster, so you can disable data collection with this command:

echo 'marvel.agent.enabled: false' >> ./config/elasticsearch.yml 
運行 Elasticsearch

Elasticsearch 已經蓄勢待發,如今你即可以運行它了:

./bin/elasticsearch

若是你想讓它在後臺保持運行的話能夠在命令後面再加一個 -d

開啓後你就可使用另外一個終端窗口來進行測試了:

curl 'http://localhost:9200/?pretty' 

你應該看到以下提示:

{
   "status": 200, "name": "Shrunken Bones", "version": { "number": "1.4.0", "lucene_version": "4.10" }, "tagline": "You Know, for Search" } 

這就說明你的 Elasticsearch 集羣 已經上線運行了,這時咱們就能夠進行各類實驗了。


集羣和節點

節點 是 Elasticsearch 運行的實例。集羣 是一組有着一樣cluster.name的節點,它們協同工做,互相分享數據,提供了故障轉移和擴展的功能。固然一個節點也能夠是一個集羣。

1.3 API

與 Elasticsearch 通訊

如何與 Elasticsearch 通訊要取決於你是否使用 JAVA。

Java API

若是你使用的是 JAVA,Elasticsearch 內置了兩個客戶端,你能夠在你的代碼中使用:

節點客戶端: 節點客戶端以一個 無數據節點 的身份加入了一個集羣。換句話說,它自身是沒有任何數據的,可是他知道什麼數據在集羣中的哪個節點上,而後就能夠請求轉發到正確的節點上並進行鏈接。

傳輸客戶端: 更加輕量的傳輸客戶端能夠被用來向遠程集羣發送請求。他並不加入集羣自己,而是把請求轉發到集羣中的節點。

這兩個客戶端都使用 Elasticsearch 的 傳輸 協議,經過9300端口與 java 客戶端進行通訊。集羣中的各個節點也是經過9300端口進行通訊。若是這個端口被禁止了,那麼你的節點們將不能組成一個集羣。


TIP

Java 的客戶端的版本號必需要與 Elasticsearch 節點所用的版本號同樣,否則他們之間可能沒法識別。


更多關於 Java API 的說明能夠在這裏找到 Guide.

經過 HTTP 向 RESTful API 傳送 json

其餘的語言能夠經過9200端口與 Elasticsearch 的 RESTful API 進行通訊。事實上,如你所見,你甚至可使用行命令 curl 來與 Elasticsearch 通訊。


Elasticsearch 官方提供了不少種編程語言的客戶端,也有和許多社區化軟件的集成插件,這些均可以在Guide 裏面找到。


向 Elasticsearch 發出的請求和其餘全部的 HTTP 請求的組成部分是一致的。例如,計算集羣中文件的數量,咱們就可使用:

<1> <2> <3> <4> curl -XGET 'http://localhost:9200/_count?pretty' -d ' { <5> "query": { "match_all": {} } } ' 
    1. 相應的 HTTP 請求方法 或者 變量 : GETPOSTPUTHEAD 或者 DELETE
    2. 集羣中任意一個節點的訪問協議、主機名以及端口。
    3. 請求的路徑。
    4. 任意一個查詢後再加上 ?pretty 就能夠生成 更加美觀 的JSON反饋,以加強可讀性。
    5. 一個 JSON 編碼的請求主體(若是須要的話)。

Elasticsearch 將會返回一個 HTTP 狀態碼相似於 '200 OK',以及一個 JSON 格式的主體(除了單純的 'HEAD' 請求),上面的請求會獲得下方的 JSON 主體:

{
    "count" : 0, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 } } 

在反饋中,咱們並無看見 HTTP 的頭部信息,由於咱們沒有告知 curl 顯示這些內容。若是你想看到頭部信息,能夠在使用 curl 命令的時候再加上 -i 這個參數:

curl -i -XGET 'localhost:9200/' 

從如今開始,本書裏全部涉及 curl 命令的部分咱們都會進行簡寫,由於主機、端口等信息都是相同的,縮減前的樣子:

curl -XGET 'localhost:9200/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}'

咱們將會簡寫成這樣:

GET /_count
{
    "query": { "match_all": {} } }

1.4 文檔

面向文檔

程序中的對象不多是單純的鍵值與數值的列表。更多的時候它擁有一個複雜的結構,好比包含了日期、地理位置、對象、數組等。

早晚你會把這些對象存儲在數據庫中。你會試圖將這些豐富而又龐大的數據都放到一個由行與列組成的關係數據庫中,而後你不得不根據每一個字段的格式來調整數據,而後每次重建它你都要檢索一遍數據。

Elasticsearch 是 面向文檔型數據庫,這意味着它存儲的是整個對象或者 文檔,它不但會存儲它們,還會爲他們創建索引,這樣你就能夠搜索他們了。你能夠在 Elasticsearch 中索引、搜索、排序和過濾這些文檔。不須要成行成列的數據。這將會是徹底不一樣的一種面對數據的思考方式,這也是爲何 Elasticsearch 能夠執行復雜的全文搜索的緣由。

JSON

Elasticsearch使用 JSON (或稱做JavaScript Object Notation ) 做爲文檔序列化的格式。JSON 已經被大多數語言支持,也成爲 NoSQL 領域的一個標準格式。它簡單、簡潔、易於閱讀。

把這個 JSON 想象成一個用戶對象:

{
    "email": "john@smith.com", "first_name": "John", "last_name": "Smith", "about": { "bio": "Eco-warrior and defender of the weak", "age": 25, "interests": [ "dolphins", "whales" ] }, "join_date": "2014/05/01", } 

雖然 user 這個對象很是複雜,可是它的結構和含義都被保留到 JSON 中了。在 Elasticsearch 中,將對象轉換爲 JSON 並做爲索引要比在表結構中作相同的事情簡單多了。


將你的數據轉換爲 JSON

幾乎全部的語言都有將任意數據轉換、機構化成 JSON,或者將對象轉換爲JSON的模塊。查看 serialization 以及marshalling 兩個 JSON 模塊。The official Elasticsearch clients 也能夠幫你自動結構化 JSON。

1.5 索引

啓程

爲了能讓你感覺一下 Elasticsearch 能作什麼以及它是有多麼的易用,咱們會先爲你簡單展現一下,其中包括了基本的 建立索引搜索 以及 聚合

咱們會在這裏向你介紹一些新的術語以及簡單的概念,即便你沒有立刻接受這些概念也沒有關係。咱們會在以後的章節中逐漸幫你理解它們。

因此,準備開始享受 Elasticsearch 的學習之旅把!

創建一個員工名單

想象咱們正在爲一個名叫 megacorp 的公司的 HR 部門製做一個新的員工名單系統,這些名單應該能夠知足實時協同工做,因此它應該能夠知足如下要求:

  • 數據能夠包含多個值的標籤、數字以及純文本內容,
  • 能夠檢索任何職員的全部數據。
  • 容許結構化搜索。例如,查找30歲以上的員工。
  • 容許簡單的全文搜索以及相對複雜的短語搜索。
  • 在返回的匹配文檔中高亮關鍵字。
  • 擁有數據統計與管理的後臺。
爲員工檔案建立索引

這個項目的第一步就是存儲員工的數據。這樣你就須要一個「員工檔案」的表單,這樣每一個文檔都表明着一個員工。在 Elasticsearch 中,存儲數據的行爲就叫作 索引(indexing) ,可是在咱們索引數據前,咱們須要決定將數據存儲在哪裏。

在 Elasticsearch 中,文檔屬於一種 類型(type),各類各樣的類型存在於一個 索引 中。你也能夠經過類比傳統的關係數據庫獲得一些大體的類似之處:

關係數據庫     ⇒ 數據庫 ⇒ 表    ⇒ 行    ⇒ 列(Columns)
Elasticsearch  ⇒ 索引   ⇒ 類型  ⇒ 文檔  ⇒ 字段(Fields)

一個 Elasticsearch 集羣能夠包含多個 索引(數據庫),也就是說其中包含了不少 類型(表)。這些類型中包含了不少的 文檔(行),而後每一個文檔中又包含了不少的 字段(列)。


索引 索引 索引

你可能發如今 Elasticsearch 中,索引這個詞彙已經被賦予了太多意義,因此在這裏咱們有必要澄清一下:

索引 (名詞)

如上文所說,一個 索引 就相似於傳統關係型數據庫中的 數據庫。這裏就是存儲相關文檔的的地方。

索引 (動詞)

爲一個文檔建立索引 是把一個文檔存儲到一個索引(名詞)中的過程,這樣它才能被檢索。這個過程很是相似於 SQL 中的 INSERT 命令,若是已經存在文檔,新的文檔將會覆蓋舊的文檔。

反向索引

在關係數據庫中的某列添加一個 索引,好比多路搜索樹(B-Tree)索引,就能夠加速數據的取回速度, Elasticsearch 以及 Lucene 使用的是一個叫作 反向索引(inverted index) 的結構來實現相同的功能。

一般,每一個文檔中的字段都被建立了索引(擁有一個反向索引),所以他們能夠被搜索。若是一個字段缺失了反向索引的話,它將不能被搜索。咱們將會在以後的《反向索引》章節中詳細介紹它。


因此爲了建立員工名單,咱們須要進行以下操做:

  • 爲每個員工的 文檔 建立索引,每一個 文檔 都包含了一個員工的全部信息。
  • 每一個文檔都會被標記爲 employee 類型
  • 這種類型將存活在 megacorp 這個 索引 中。
  • 這個索引將會存儲在 Elasticsearch 的集羣中

在實際的操做中,這些操做是很是簡單的(即便看起來有這麼多步驟)。咱們能夠把如此之多的操做經過一個命令來完成:

PUT /megacorp/employee/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] } 

注意在 /megacorp/employee/1 路徑下,包含了三個部分:

名字 內容
megacorp 索引的名字
employee 類型的名字
1 當前員工的ID

請求部分,也就是 JSON 文檔,在這裏包含了關於這名員工的全部信息。他的名字是 「John Smith」,他已經25歲了,他很喜歡攀巖。

怎麼樣?很簡單吧!咱們在操做前不須要進行任何管理操做,好比建立索引,或者爲字段指定數據的類型。咱們就這麼直接地爲一個文檔建立了索引。Elasticsearch 會在建立的時候爲它們設定默認值,因此全部管理操做已經在後臺被默默地完成了。

在進行下一步以前,咱們再爲這個目錄添加更多的員工信息吧:

PUT /megacorp/employee/2 { "first_name" : "Jane", "last_name" : "Smith", "age" : 32, "about" : "I like to collect rock albums", "interests": [ "music" ] } PUT /megacorp/employee/3 { "first_name" : "Douglas", "last_name" : "Fir", "age" : 35, "about": "I like to build cabinets", "interests": [ "forestry" ] }
相關文章
相關標籤/搜索