ElasticSearch爲Java用戶提供了兩種內置客戶端:
1.節點客戶端:以無數據節點身份加入集羣,(無數據節點的含義就是不存儲任何數據)但他知道數據在集羣中的具體位置,並能直接轉發請求到對應節點上。
2.傳輸客戶端:不加入集羣,只是簡單轉發請求給集羣中的節點。
兩個客戶端都通過9300端口與集羣交互。集羣中的節點之間也通過9300端口通信。
一個節點是一個單一的服務器,是集羣的一部分,存儲數據,並且參與集羣的索引和搜索功能。通過配置特定的集羣名稱來加入特定的集羣。
一個集羣是由一個或多個節點(服務器)組成的。 一個集羣中只有一個節點是有效的並且是非常好的。
向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格式的請求主體(如果請求需要的話)
1.索引
Elasticsearch是面向文檔(document oriented)的,它可以存儲整個對象或文檔(document)。然而它不僅僅是存儲,還會索引(index)每個文檔的內容使之可以被搜索。
在elasticSearch中存儲數據的行爲叫做索引(index)(數據庫),每個文檔歸屬於類型(type)(表)。每一個類型包含多個文檔(document)(記錄、行),每個文檔包含多個字段(field)(字段)。
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices(對應數據庫) -> Types(對於數據表) -> Documents(對應表的記錄) -> Fields(字段)
在elasticSearch中“索引”的含義:
-
類似於傳統關係數據庫的數據庫名稱
-
類似於數據庫中的insert關鍵字。
-
倒排索引,類似於數據庫中的特定列的索引。
eg:創建員工目錄:爲每個員工的文檔建立索引user,每個文檔的類型爲employee,索引存儲在ElasticSearch集羣中 。
path:PUT /megacorp/employee/1
{
"first_name" : "李",
"last_name" : "爾",
"age" : 25,
"about" : "我喜歡爬山、游泳",
"interests": [ "運動", "音樂" ]
}
path包含三部分信息:
名字 |
說明 |
megacorp |
索引名 |
employee |
類型名 |
1 |
這個員工的ID |
在目錄中加入更多員工信息。
2.檢索文檔
-
索引過程已經存儲了一些數據,體驗elasticSearch檢索單個員工的信息。 執行HTTP GET請求並指出文檔的“地址”——索引、類型和ID既可。
GET /megacorp/employee/1
-
在結尾使用關鍵字_search來取代原來的文檔ID。響應內容的hits數組中包含了我們所有的三個文檔。默認情況下搜索會返回前10個結果
GET /megacorp/employee/_search
-
查詢字符串查詢(參數在url中)
GET /megacorp/employee/_search?q=last_name:爾
-
使用DSL語句查詢(參數使用json格式傳遞)
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "爾"
}
}
}
複雜的搜索之添加搜索過濾器
eg:得到年齡大於22歲的員工(大於:gt,小於:lt)
GET /megacorp/employee/_search
{
"query" : {
"filtered" : {
"filter" : {
"range" : {
"age" : { "gt" : 22 }
}
},
"query" : {
"match" : {
"last_name" : "爾"
}
}
}
}
}
全文搜索。按照文檔與查詢條件的匹配程度排序並返回結果集。傳統數據庫中,只有匹配不匹配,沒有匹配查詢。
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"about" : "爬"
}
}
}
短語搜索。只要將match查詢變更爲match_phrase查詢即可。 查詢同時包含"遊"和"泳"(並且是相鄰的)的員工記錄
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "游泳"
}
}
}
聚合。類似於數據庫的group by(要先開啓text類型)。
開啓text類型
POST /megacorp/employee/
{
"properties": {
"interest": {
"type":"text",
"fielddata":true
}
}
}
找到所有職員中最大的共同點(興趣愛好)是什麼
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}