1. 程式人生 > >ElasticSearch教程-通過API與ES互動

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控制檯中也使用了與上面相同的格式。