ElasticSearch教程-通過API與ES互動
與Elasticsearch互動
如何與Elasticsearch互動取決於你是否使用Java。
Java API
Elasticsearch為Java使用者提供了兩種內建客戶端:
節點客戶端(node client):
節點客戶端以無資料節點(none data node)身份加入叢集,換言之,它自己不儲存任何資料,但是它知道資料在叢集中的具體位置,並且能夠直接轉發請求到對應的節點上。
傳輸客戶端(Transport client):
這個更輕量的傳輸客戶端能夠傳送請求到遠端叢集。它自己不加入叢集,只是簡單轉發請求給叢集中的節點。
兩個Java客戶端都通過9300埠與叢集互動,使用Elasticsearch傳輸協議(Elasticsearch Transport Protocol)。叢集中的節點之間也通過9300埠進行通訊。如果此埠未開放,你的節點將不能組成叢集。
TIP
Java客戶端所在的Elasticsearch版本必須與叢集中其他節點一致,否則,它們可能互相無法識別。
關於Java API的更多資訊請檢視相關章節:Java API
基於HTTP協議,以JSON為資料互動格式的RESTful API
其他所有程式語言都可以使用RESTful API,通過9200埠的與Elasticsearch進行通訊,你可以使用你喜歡的WEB客戶端,事實上,如你所見,你甚至可以通過curl命令與Elasticsearch通訊。
NOTE
Elasticsearch官方提供了多種程式語言的客戶端——Groovy,Javascript, .NET,PHP,Perl,Python,以及 Ruby——還有很多由社群提供的客戶端和外掛,所有這些可以在
向Elasticsearch發出的請求的組成部分與其它普通的HTTP請求是一樣的:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
- VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
- PROTOCOL http或者https協議(只有在Elasticsearch前面有https代理的時候可用)
- HOST Elasticsearch叢集中的任何一個節點的主機名,如果是在本地的節點,那麼就叫localhost
- PORT Elasticsearch HTTP服務所在的埠,預設為9200
- PATH API路徑(例如_count將返回叢集中文件的數量),PATH可以包含多個元件,例如_cluster/stats或者_nodes/stats/jvm
- QUERY_STRING 一些可選的查詢請求引數,例如?pretty引數將使請求返回更加美觀易讀的JSON資料
- BODY 一個JSON格式的請求主體(如果請求需要的話)
舉例說明,為了計算叢集中的文件數量,我們可以這樣做:
curl -XGET 'http://localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } } '
Elasticsearch返回一個類似200 OK的HTTP狀態碼和JSON格式的響應主體(除了HEAD請求)。上面的請求會得到如下的JSON格式的響應主體:
{ "count" : 0, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 } }
我們看不到HTTP頭是因為我們沒有讓curl顯示它們,如果要顯示,使用curl命令後跟-i引數:
curl -i -XGET 'localhost:9200/'
對於本書的其餘部分,我們將簡寫curl請求中重複的部分,例如主機名和埠,還有curl命令本身。
一個完整的請求形如:
curl -XGET 'localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }'
我們將簡寫成這樣:
GET /_count { "query": { "match_all": {} } }
事實上,在Sense控制檯中也使用了與上面相同的格式。