ES爲開發者提供了很是豐富的基於HTTP協議的Rest API,只須要向ES服務端發送簡單的Rest請求,就能夠實現很是強大的功能。本篇文章主要介紹ES中經常使用操做的Rest API的使用,同時會講解ES的源代碼工程中的API接口文檔,經過了解這個API文檔的接口描述結構,就基本上能夠實現ES中的絕大部分功能。
注意:查詢是ES的核心。做爲一個先進的搜索引擎,ES中提供了多種查詢接口。本篇僅僅會涉及查詢API的結構,而具體如何使用ES所提供的各類查詢API,會在接下來的博文中作詳細介紹。
若是以前沒有用過相似於ES這樣的索引數據庫(暫且將ES歸爲數據庫類,與傳統的數據庫有較大的區別),要理解本篇博文介紹的API是有些難度的。本節先介紹一些基礎知識,對理解全文有很幫助。
筆者在學習軟件開發過程當中,屢次聽到過Rest Http這個概念,但在很長的一段時間裏,死活搞不懂這玩意究竟是個什麼東西。剛開始看相關資料時,看得雲裏霧裏,徹底不知所云 _。這玩意太過於抽象和理論,內心以爲有必要搞這麼複雜麼。隨着本身動手開發的東西愈來愈多,纔開始對它有了一丟丟感受。
Rest徹底不是三言兩語就能將清楚的,它有本身的一套體系,因此筆者打算之後單獨寫一些有關Rest的博文。在這裏推薦一篇優秀的文章,它對Rest講的至關清楚,本人看完以後真有醍醐灌頂的感受!
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個主要的內容外,還有其餘的定義內容,詳見官網文檔。
下面介紹一下ES中的一些經常使用的Rest API。掌握了這些API的用法,基本上就能夠簡單地使用ES了。
咱們須要藉助可以發送HTTP請求的工具調用這些API,工具是能夠任意的,包括網頁瀏覽器。這裏利用Linux上的curl命令來發送HTTP請求。基本的命令結構爲:
curl <-Xaction> url -d 'body' # 這裏的action表示HTTP協議中的各類動做,包括GET、POST、PUT、DELETE等。
注意。文中的示例代碼裏面包含了用戶註釋的文字,就是 # 號後面的文字。運行代碼時,請注意刪除這些註釋。
(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
返回結果的主要字段意義:
咱們也能夠在請求中添加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參見官網文檔。
(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官網文檔。
(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相關操做參加官網文檔。
(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中的查詢操做。
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個部分與文檔對應起來。經過這個例子,就能夠在閱讀其餘文檔後,使用正確的操做了。
本文重點介紹了ES中的一些經常使用Rest API的用法,並在開始部分簡單地介紹了一些基礎知識(Rest和mapping)。掌握了這些API的調用,就能夠利用ES完成簡單的應用程序了。固然,ES的API遠不止這些,若是想要更加深刻地瞭解ES的使用及其內部原理,建議先仔細地閱讀ES的官網文檔。而後下載其源代碼進行研究。
想進階的同窗,請參考: