基於Apache Lucene構建的開源搜索引擎node
採用Java編寫,提供了簡單易用的RESTFul API數據庫
輕鬆的橫向拓展,可支持PB級的結構化和非結構化的數據處理數據結構
海量數據分析引擎curl
站內搜索引擎jvm
數據倉庫搜索引擎
與Elaticsearch交互取決因而否使用Java Java API Elasticsearch爲Java用戶提供了兩種內置客戶端url
節點客戶端以無數據節點(none data node)身份加入集羣,它本身不存儲任何數據,可是它知道數據在集羣中的具體位置,而且可以直接妝發請求到對應的節點間上。spa
更輕量的傳輸客戶端可以發生請求到遠程集羣。它本身不加入集羣,只是簡單轉發請求給集羣中的節點。3d
節點客戶端和傳輸客戶端都是經過9300端口與集羣交互的,使用Elasticsearch傳輸協議。集羣中的節點之間也是經過9300端口進行通訊的。若是這個端口沒有開放,你的節點將沒法組成集羣。代理
注意:
Java客戶端所在的Elasticsearch版本必須與集羣中其餘節點一致,不然,它們可能互相 沒法識別。
其餘的全部成勳語言均可以i使用RESTful API,經過9200端口與Elasticsearch進行通訊,可使用WEB客戶端,甚至可使用curl命令與Elasticsearch通訊
向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集羣中的任何一個節點的主機名,若是是在本地的節點,那麼就叫 localhos
PORT Elasticsearch HTTP服務所在的端口,默認爲9200
PATH API路徑(例如_count將返回集羣中文檔的數量),PATH能夠包含多個組件,例如 _cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可選的查詢請求參數,例如 ?pretty 參數將使請求返回更加美觀 易讀的JSON數據
BODY 一個JSON格式的請求主體(若是請求須要的話)
與傳統的數據庫的存儲方式不一樣,Elasticsearch是基於文檔存儲數據的,之前一個對象以一條記錄存儲在數據庫裏面,如今是以JSON的方式進行文檔存儲,使得存儲操做變得更加方便簡單。在Elasticsearch中,文檔屬於一種類型(type),而這些類型存在全部(index)中,關係能夠用下面的方式類比:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
複製代碼
索引在Elasticsearch有不一樣的含義,因此須要區分它
索引(名詞)如上文所述,一個索引(index)就像是傳統關係型數據庫中的數據庫,它是相關文檔的存儲的地方,index的附屬是indices或indexes.
索引(動詞)[索引一個文檔]標識一個文檔存儲到索引(名詞)裏,以便它能夠被檢索或者查詢。這很像SQL中的INSERT關鍵字,差異是,若是翁當已經存在,新的文檔將覆蓋就的文檔
倒排索引:傳統數據庫爲特定列增長一個索引,例如B-Tree索引來加速索引。Elasticsearch和Lucene使用一種叫作倒排索引的(inverted index)的數據結構來表達到相同的目的。
傳統的數據庫很難實現該功能,可是在Elasticsearch卻能夠輕易的實現全文的檢索。
例如:
GET /_search
{
"query": {
"match": {
"about": "rock climbing"
}
}
}
複製代碼
返回以下結果:
這個例子返回了兩個結果,可是這兩個結果的分數是分高低的,第一個的分數顯然高於第二個的。這個例子也解釋了Elasticsearch在文本字段中進行了全文的檢索,而且返回相關性嘴袋的結果集。相關性在Elasticsearch在很是重要,這個概念也是體現了傳統數據庫和Elasticsearch的區別。
除了上面的全文檢索,咱們有時候也須要精確的匹配若干的單詞或者短語,這個時候Es也是能夠作到的。
GET /_search
{
"query": {
"match_phrase": {
"about": "rock climbing"
}
}
}
複製代碼
返回結果以下:
高亮匹配到關鍵字,這樣用戶能夠知道Wie上面這些文檔和查詢相匹配。在Elasticsearch作到這個是很簡單的,只須要在語句中添加highlight參數。
GET /_search
{
"query": {
"match_phrase": {
"about": "rock climbing"
}
},
"highlight": {
"fields": {
"about":{}
}
}
}
複製代碼
返回的結果以下:
Elasticsearch有一個功能叫作聚合(aggresgation),容許在生產複雜的分析統計,它的功能項傳統數據庫的GROUP BY,可是比傳統的數據庫的GROUP BY要強大不少。
GET megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": {
#這裏須要注意的是若是根據某個字段統計須要在後面添加keyword關鍵字
"field": "interests.keyword"
}
}
}
}
複製代碼