與 Elasticsearch 通信
如何與 Elasticsearch 通信要取決于你是否使用 JAVA。
Java API
- 如果你使用的是 JAVA,Elasticsearch 內(nèi)置了兩個(gè)客戶(hù)端:
- 節(jié)點(diǎn)客戶(hù)端
節(jié)點(diǎn)客戶(hù)端以一個(gè) 無(wú)數(shù)據(jù)節(jié)點(diǎn) 的身份加入了一個(gè)集群。
換句話說(shuō),它自身是沒(méi)有任何數(shù)據(jù)的,但是他知道什么數(shù)據(jù)在集群中的哪一個(gè)節(jié)點(diǎn)上,然后就可以請(qǐng)求轉(zhuǎn)發(fā)到正確的節(jié)點(diǎn)上并進(jìn)行連接。 - 傳輸客戶(hù)端
更加輕量的傳輸客戶(hù)端可以被用來(lái)向遠(yuǎn)程集群發(fā)送請(qǐng)求。
他并不加入集群本身,而是把請(qǐng)求轉(zhuǎn)發(fā)到集群中的節(jié)點(diǎn)。
- 這兩個(gè)客戶(hù)端都使用 Elasticsearch 的 傳輸協(xié)議,通過(guò)9300端口與 java 客戶(hù)端進(jìn)行通信。
- 集群中的各個(gè)節(jié)點(diǎn)也是通過(guò)9300端口進(jìn)行通信。
- 如果這個(gè)端口被禁止了,那么你的節(jié)點(diǎn)們將不能組成一個(gè)集群。
TIPs
Java 的客戶(hù)端的版本號(hào)必須要與 Elasticsearch 節(jié)點(diǎn)所用的版本號(hào)一樣,不然他們之間可能無(wú)法識(shí)別。
通過(guò) HTTP 向 RESTful API 傳送 json
其他的語(yǔ)言可以通過(guò)9200端口與 Elasticsearch 的 RESTful API 進(jìn)行通信。
事實(shí)上,如你所見(jiàn),你甚至可以使用行命令 curl 來(lái)與 Elasticsearch 通信。
- 向 Elasticsearch 發(fā)出的請(qǐng)求和其他所有的 HTTP 請(qǐng)求的組成部分是一致的。
例如:
計(jì)算集群中文件的數(shù)量,我們就可以使用:
(1) (2) (3)(4)
curl -i -XGET 'http://localhost:9200/_count?pretty' -d '
{ (5)
"query": {
"match_all": {}
}
}
'
(1)相應(yīng)的 HTTP 請(qǐng)求方法 或者 變量 : GET, POST, PUT, HEAD 或者 DELETE。
(2)集群中任意一個(gè)節(jié)點(diǎn)的訪問(wèn)協(xié)議、主機(jī)名以及端口。
(3)請(qǐng)求的路徑。
(4)任意一個(gè)查詢(xún)后再加上 ?pretty 就可以生成 更加美觀 的JSON反饋,以增強(qiáng)可讀性。
(5)一個(gè) JSON 編碼的請(qǐng)求主體(如果需要的話)。
Elasticsearch 將會(huì)返回一個(gè) HTTP 狀態(tài)碼類(lèi)似于 '200 OK',以及一個(gè) JSON 格式的主體(除了單純的 'HEAD' 請(qǐng)求),上面的請(qǐng)求會(huì)得到下方的 JSON 主體:
{
"count" : 0,
"_shards" : {
"total" : 0,
"successful" : 0,
"skipped" : 0,
"failed" : 0
}
}