Elasticsearch入門,這一篇就夠了

實時搜索引擎Elasticsearch

ES爲開發者提供了很是豐富的基於HTTP協議的Rest API,只須要向ES服務端發送簡單的Rest請求,就能夠實現很是強大的功能。本篇文章主要介紹ES中經常使用操做的Rest API的使用,同時會講解ES的源代碼工程中的API接口文檔,經過了解這個API文檔的接口描述結構,就基本上能夠實現ES中的絕大部分功能。

注意:查詢是ES的核心。做爲一個先進的搜索引擎,ES中提供了多種查詢接口。本篇僅僅會涉及查詢API的結構,而具體如何使用ES所提供的各類查詢API,會在接下來的博文中作詳細介紹。

基礎知識

若是以前沒有用過相似於ES這樣的索引數據庫(暫且將ES歸爲數據庫類,與傳統的數據庫有較大的區別),要理解本篇博文介紹的API是有些難度的。本節先介紹一些基礎知識,對理解全文有很幫助。

Rest介紹

筆者在學習軟件開發過程當中,屢次聽到過Rest Http這個概念,但在很長的一段時間裏,死活搞不懂這玩意究竟是個什麼東西。剛開始看相關資料時,看得雲裏霧裏,徹底不知所云 _。這玩意太過於抽象和理論,內心以爲有必要搞這麼複雜麼。隨着本身動手開發的東西愈來愈多,纔開始對它有了一丟丟感受。

Rest徹底不是三言兩語就能將清楚的,它有本身的一套體系,因此筆者打算之後單獨寫一些有關Rest的博文。在這裏推薦一篇優秀的文章,它對Rest講的至關清楚,本人看完以後真有醍醐灌頂的感受!

Mapping詳解

Mapping是ES中的一個很重要的內容,它相似於傳統關係型數據中table的schema,用於定義一個索引(index)的某個類型(type)的數據的結構。

在傳統關係型數據庫,咱們必須首先建立table並同時定義其schema,以下面的SQL語句。下面代碼中小括號內的代碼的做用就是定義person_info的schema(模式)。

create table person_info ( name varchar(20), age tinyint )

 

在ES中,咱們無需手動建立type(至關於table)和mapping(相關與schema)。在默認配置下,ES能夠根據插入的數據自動地建立type及其mapping。在下面的API介紹部分中,會作相關的試驗。固然,在實際使用過程當中咱們可能就想硬性規定mapping,能夠經過配置文件關閉ES的自動建立mapping功能。

mapping中主要包括字段名、字段數據類型和字段索引類型這3個方面的定義。

字段名:這就不用說了,與傳統數據庫字段名做用同樣,就是給字段起個惟一的名字,好讓系統和用戶能識別。

字段數據類型:定義該字段保存的數據的類型,不符合數據類型定義的數據不能保存到ES中。下表列出的是ES中所支持的數據類型。(大類是對全部類型的一種歸類,小類是實際使用的類型。)

大類 包含的小類
String string
Whole number byte, short, integer, long
Floating point float, double
Boolean boolean
Date date

字段索引類型:索引是ES中的核心,ES之因此可以實現實時搜索,徹底歸功於Lucene這個優秀的Java開源索引。在傳統數據庫中,若是字段上創建索引,咱們仍然可以以它做爲查詢條件進行查詢,只不過查詢速度慢點。而在ES中,字段若是不創建索引,則就不能以這個字段做爲查詢條件來搜索。也就是說,不創建索引的字段僅僅能起到數據載體的做用。string類型的數據確定是平常使用得最多的數據類型,下面介紹mapping中string類型字段能夠配置的索引類型。

索引類型 解釋
analyzed 首先分析這個字符串,而後再創建索引。換言之,以全文形式索引此字段。
not_analyzed 索引這個字段,使之能夠被搜索,可是索引內容和指定值同樣。不分析此字段。
no 不索引這個字段。這個字段不能被搜索到。

若是索引類型設置爲analyzed,在表示ES會先對這個字段進行分析(通常來講,就是天然語言中的分詞),ES內置了很多分析器(analyser),若是以爲它們對中文的支持很差,也可使用第三方分析器。因爲筆者在實際項目中僅僅將ES用做普通的數據查詢引擎,因此並無研究過這些分析器。若是將ES當作真正的搜索引擎,那麼挑選正確的分析器是相當重要的。

mapping中除了上面介紹的3個主要的內容外,還有其餘的定義內容,詳見官網文檔

經常使用的Rest API介紹

下面介紹一下ES中的一些經常使用的Rest API。掌握了這些API的用法,基本上就能夠簡單地使用ES了。

咱們須要藉助可以發送HTTP請求的工具調用這些API,工具是能夠任意的,包括網頁瀏覽器。這裏利用Linux上的curl命令來發送HTTP請求。基本的命令結構爲:

curl <-Xaction> url -d 'body' # 這裏的action表示HTTP協議中的各類動做,包括GET、POST、PUT、DELETE等。

 

注意。文中的示例代碼裏面包含了用戶註釋的文字,就是 # 號後面的文字。運行代碼時,請注意刪除這些註釋。

查看集羣(Cluster)信息相關API

(1)查看集羣健康信息。

curl -XGET "localhost:9200/_cat/heath?v"

返回結果爲:

epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks 1440206633 18:23:53 elasticsearch green 1 1 0 0 0 0 0 0 

 

返回結果的主要字段意義:

  • cluster:集羣名,是在ES的配置文件中配置的cluster.name的值。
  • status:集羣狀態。集羣共有green、yellow或red中的三種狀態。green表明一切正常(集羣功能齊全),yellow意味着全部的數據都是可用的,可是某些複製沒有被分配(集羣功能齊全),red則表明由於某些緣由,某些數據不可用。若是是red狀態,則要引發高度注意,數據頗有可能已經丟失。
  • node.total:集羣中的節點數。
  • node.data:集羣中的數據節點數。
  • shards:集羣中總的分片數量。
  • pri:主分片數量,英文全稱爲private。
  • relo:複製分片總數。
  • unassign:未指定的分片數量,是應有分片數和現有的分片數的差值(包括主分片和複製分片)。

咱們也能夠在請求中添加help參數來查看每一個操做返回結果字段的意義。

curl -XGET "localhost:9200/_cat/heath?help"

返回結果以下:

epoch         | t,time | seconds since 1970-01-01 00:00:00 timestamp | ts,hms,hhmmss | time in HH:MM:SS cluster | cl | cluster name status | st | health status node.total | nt,nodeTotal | total number of nodes node.data | nd,nodeData | number of nodes that can store data shards | t,sh,shards.total,shardsTotal | total number of shards pri | p,shards.primary,shardsPrimary | number of primary shards relo | r,shards.relocating,shardsRelocating | number of relocating nodes init | i,shards.initializing,shardsInitializing | number of initializing nodes unassign | u,shards.unassigned,shardsUnassigned | number of unassigned shards pending_tasks | pt,pendingTasks | number of pending tasks 

 

確實是很好很強大。有了這個東東,就能夠減小看文檔的時間。ES中許多API均可以添加help參數來顯示字段含義,哪些能夠這麼作呢?每一個API都試試就知道了。

固然,若是你以爲返回的東西太多,看着眼煩,咱們也能夠人爲地指定返回的字段。

curl -XGET "localhost:9200/_cat/health?h=cluster,pri,relo&v"

此次的返回結果就簡單不少羅。對於患有嚴重強迫症的患者來講,這是福音啊!

cluster pri relo elasticsearch 0 0 

(2)查看集羣中的節點信息。

curl -XGET "localhost:9200/_cat/nodes?v"

返回節點的詳細信息以下:

host          ip            heap.percent ram.percent load node.role master name master.hadoop localhost 3 35 0.00 d * Ezekiel 

 

(3)查看集羣中的索引信息。

curl -XGET "localhost:9200/_cat/indices?v"

 

返回集羣中的索引信息以下:

health status index      pri rep docs.count docs.deleted store.size pri.store.size yellow open index_test 5 1 0 0 575b 575b 

 

更多的查看和監視ES的API參見官網文檔

索引(Index)相關API

(1)建立一個新的索引。

curl -XPUT "localhost:9200/index_test"

若是返回下面的信息,則說明索引建立成功。若是不是,則ES會返回相應的異常信息。一般能夠經過異常信息的最後一項推斷出失敗的緣由。

{
    "acknowledged": true }

上面的操做使用默認的配置信息建立一個索引。大多數狀況下,咱們想在索引建立的時候就將咱們所需的mapping和其餘配置肯定好。下面的操做就能夠在建立索引的同時,建立settings和mapping。

curl -XPUT "localhost:9200/index_test" -d ' # 注意這裏的'號 { "settings": { "index": { "number_of_replicas": "1", # 設置複製數 "number_of_shards": "5" # 設置主分片數 } }, "mappings": { # 建立mapping "test_type": { # 在index中建立一個新的type(至關於table) "properties": { "name": { # 建立一個字段(string類型數據,使用普通索引) "type": "string", "index": "not_analyzed" }, "age": { "type": "integer" } } } } }'

 

(2)刪除一個索引。

curl -XDELETE "localhost:9200/index_test"

若是返回與建立索引一樣的信息,則說明刪除成功。反之,則返回相應的異常信息。更多的索引操做參見ES官網文檔

映射(Mapping)相關API

(1)建立索引的mapping。

curl -XPUT 'localhost:9200/index_test/_mapping/test_type' -d ' { "test_type": { # 注意,這裏的test_type與url上的test_type名保存一致 "properties": { "name": { "type": "string", "index": "not_analyzed" }, "age": { "type": "integer" } } } }'

 

若是不想單首創建mapping,可使用上一節的方法(建立索引時建立mappings)。

假設咱們的項目中有多個環境(開發環境、測試環境等),那每個環境的mapping總要一致的吧,那每次建立一次mappings就比較麻煩了,並且還容易致使數據不一致。莫急,ES還給咱們準備另一種建立mapping的方式。能夠按照下面的步驟來作。

步驟1 建立一個擴展名爲test_type.json的文件名,其中type_test就是mapping所對應的type名。

步驟2 在test_type.json中輸入mapping信息。假設你的mapping以下:

{
  "test_type": { # 注意,這裏的test_type與json文件名必須一致 "properties": { "name": { "type": "string", "index": "not_analyzed" }, "age": { "type": "integer" } } } }

 

步驟3 在$ES_HOME/config/路徑下建立mappings/index_test子目錄,這裏的index_test目錄名必須與咱們要創建的索引名一致。將test_type.json文件拷貝到index_tes目錄下。

步驟4 建立index_test索引。操做以下:

curl -XPUT "localhost:9200/index_test" # 注意,這裏的索引名必須與mappings下新建的index_test目錄名一致

這樣咱們就建立了一個新的索引,而且使用了test_type.json所定義的mapping做爲索引的mapping。就是這麼簡單方便!

(2)刪除mapping。

curl -XDELETE 'localhost:9200/index_test/_mapping/test_type'

(3)查看索引的mapping。

curl -XGET 'localhost:9200/index_test/_mapping/test_type'

 

更多的mapping相關操做參加官網文檔

文檔(document)相關API

(1)新增一個文檔。

curl -XPUT 'localhost:9200/index_test/test_type/1?pretty' -d ' # 這裏的pretty參數的做用是使得返回的json顯示地更加好看。1是文檔的id值(惟一鍵)。 { "name": "zhangsan", "age" : "12" }'

 

(2)更新一個文檔

curl -XPOST 'localhost:9200/index_test/test_type/1?pretty' -d ' # 這裏的1必須是索引中已經存在id,不然就會變成新增文檔操做 { "name": "lisi", "age" : "12" }' 

 

(3)刪除一個文檔

curl -XDELETE 'localhost:9200/index_test/test_type/1?pretty' # 這裏的1必須是索引中已經存在id

 

(4)查詢單個文檔

curl -XGET 'localhost:9200/index_test/test_type/1?pretty'

 

上面的操做僅僅查詢id爲1的一條文檔,這樣看彷佛ES的查詢也太弱了。前面已經說過了,查詢操做是ES中的核心,是其立身的根本。可是本文的重點並不在這裏,爲了防止文章的篇幅過長,以後將專本介紹ES中的查詢操做。

源代碼中提供的Rest API文檔結構

ES的源代碼託管在Github上。將源代碼下載下來以後,裏面有一個文件夾專門存放ES中絕大部分的Rest API。有了這些文檔,就沒必要每次都要到官網上查詢接口文檔了(PS:ES的官網真的很慢)。 
下面以cat.health.json文件爲例簡單地介紹這些Rest API文檔的結構。一旦結構搞清楚了,文檔看起來就比較順心,ES用起來就更加駕輕就熟了!

{
  "cat.health": { "documentation": "http://www.elastic.co/guide/en/elasticsearch/reference/master/cat-health.html", # 該文檔對應的官方站點 "methods": ["GET"], "url": { # url部分可選 "path": "/_cat/health", "paths": ["/_cat/health"], "parts": { }, "params": { "local": { "type" : "boolean", "description" : "Return local information, do not retrieve the state from master node (default: false)" }, "master_timeout": { "type" : "time", "description" : "Explicit operation timeout for connection to master node" }, "h": { "type": "list", "description" : "Comma-separated list of column names to display" }, "help": { "type": "boolean", "description": "Return help information", "default": false }, "ts": { "type": "boolean", "description": "Set to false to disable timestamping", "default": true }, "v": { "type": "boolean", "description": "Verbose mode. Display column headers", "default": true } } }, "body": null } }

 

 

上面文檔接口所對應的Reqeust操做以下:

curl -XGET "localhost:9200/_cat/health?v" -d 'body'

 

該操做命令可劃分爲5個部分,下面把這5個部分與文檔對應起來。經過這個例子,就能夠在閱讀其餘文檔後,使用正確的操做了。

  1. 第1部分(-XGET):對應文檔中methods所包含的GET操做。
  2. 第2部分(localhost:9200):是ES服務端所在主機的hostname和port。
  3. 第3部分(/_cat/health):對應文檔中的url。其中path是最簡單的url;paths是除了path以外的其餘url;parts描述和解釋paths裏面的url的可變部分(一般用{}包裹,如{index})。
  4. 第4部分v:表示參數,對應文檔中的params。像「v」這種boolean類型的參數,不須要特地指定其布爾值(true或者false),出現即表示true,不然爲false。
  5. 第5部分body:表示要傳遞的數據主體,對應文檔中的body。若是body裏面指明「required=true」,則表示必須傳入body數據。具體body裏面須要傳怎樣的數據,則能夠訪問文檔中的documentation字段所指明的官方站點進行查詢。

總結

本文重點介紹了ES中的一些經常使用Rest API的用法,並在開始部分簡單地介紹了一些基礎知識(Rest和mapping)。掌握了這些API的調用,就能夠利用ES完成簡單的應用程序了。固然,ES的API遠不止這些,若是想要更加深刻地瞭解ES的使用及其內部原理,建議先仔細地閱讀ES的官網文檔。而後下載其源代碼進行研究。

 

想進階的同窗,請參考:

Elasticsearch: 權威指南

相關文章
相關標籤/搜索