本系列文章記錄,摘要,總結 對Elasticsearch 的系統學習,基於官方文檔 Elasticsearch 2.x 版本 , 內容可能過時
文章目錄
1. Elasticsearch 基礎概念
1.1 Elasticsearch 是什麼
Elasticsearch 是一個開源的搜索引擎,建立在一個全文搜索引擎庫 Apache Lucene™ 基礎之上。 Lucene 可以說是當下最先進、高性能、全功能的搜索引擎庫,但是很複雜.
Elasticsearch 使用 Java 編寫的,它的內部使用 Lucene 做索引與搜索,但它使全文檢索變得簡單, 通過隱藏 Lucene 的複雜性,提供一套簡單一致的 RESTful API。
1.2 Elasticsearch 功能
- 全文搜索引擎
- 一個分佈式的實時文檔存儲,每個字段 可以被索引與搜索
- 一個分佈式實時分析搜索引擎
- 能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據
1.3 與Elasticsearch交互
交互可以選擇
- Java api 交互,其中包含兩種客戶端 (默認9300)
-
節點客戶端(Node client)
節點客戶端作爲一個非數據節點加入到本地集羣中。換句話說,它本身不保存任何數據,但是它知道數據在集羣中的哪個節點中,並且可以把請求轉發到正確的節點。 -
傳輸客戶端(Transport client)
輕量級的傳輸客戶端可以將請求發送到遠程集羣。它本身不加入集羣,但是它可以將請求轉發到集羣中的一個節點上。
-
其中集羣也是通過9300 通信
-
restful API交互
一般在es搭建之後會搭建一個可視化界面,有以下選擇(也可以再搜索看看有沒有更好的,或者自己造一個?):這裏推薦: kibana(官方出品,後續還可以組合ELK), es-head (老派ui,簡單易用,推薦插件安裝方式)
2. Elasticsearch 安裝
下載較慢 , 官方下載地址包含
當前版本是 Version: 7.7.1
, 可以使用yum , apt-get , docker , zip 等方式安裝在Linux或Windows , 官方有詳細的下載安裝步驟
此處應該與你的Java 客戶端jar包版本對應 , 並且如果需要安裝kibana logstash 等也是需要版本對應
此時,你可以打開你的主機+端口 訪問你的es , 如果出現es 信息則說明成功!
如果要和Java 客戶端交互 需要注意9300 端口是否打開 9200 只是http端口
如果後面需要對中文分詞還需要安裝中文分詞器插件,下載對應版本後解壓到es/plugins/
3. 簡單的案例介紹
首先,在es中有
文檔
的概念,相當於sql中的表 ,在es中對整個文檔(相當於一條記錄)進行索引,排序,過濾,
而不是像sql那樣針對一列建立索引,並且這裏有 倒排索引 後面有詳細講解,並且使用JSON
作爲文檔的序列化格式
這裏從一個簡單的案例介紹 文檔
索引
搜索
聚合
等基礎概念 :
我們受僱於 Megacorp 公司,作爲 HR 部門新的 “熱愛無人機” (“We love our drones!”)激勵項目的一部分,我們的任務是爲此創建一個員工目錄。該目錄應當能培養員工認同感及支持實時、高效、動態協作,因此有一些業務需求:
- 支持包含多值標籤、數值、以及全文本的數據
- 檢索任一員工的完整信息
- 允許結構化搜索,比如查詢 30 歲以上的員工
- 允許簡單的全文搜索以及較複雜的短語搜索
- 支持在匹配文檔內容中高亮顯示搜索片段
- 支持基於數據創建和管理分析儀表盤
3.1 分析需求
那麼,首先我們應該存儲員工
數據,才能進行後續的操作,我們將員工
以文檔
形式存儲,一個文檔代表一個員工
, 存儲數據到es的行爲叫做索引
(動詞,索引一個文檔就是存儲一個文檔到索引中),但,在索引一個文檔前,需確定存儲到哪個索引
(名詞,類似於關係數據庫中的數據庫
概念)
所以一個es集羣
可以包含很多個索引
(名詞),每個索引
(名詞)可以包含很多個類型
(類似於表),每個類型
可以存儲多個文檔
,每個文檔
又有多個屬性
所以我們應該做以下操作:
- 每個員工索引一個文檔,文檔包含員工所有信息
- 每個文檔都是
employee
類型 - 該類型位於索引
megacorp
內 - 該索引保存在我們的es集羣中
至此,我們應該能夠分清楚每一步具體在做什麼,儘管步驟有點多,但是很簡單,那麼我們可以通過一條語句完成:
3.2 插入數據
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
解釋以下這條語句
這是cUrl 格式語句,發送put的http請求到localhost:9200/megacorp/employee/1?pretty
指定json
格式,幷包含請求內容
路徑/megacorp/employee/1
包含了:
megacorp
索引名稱
employee
類型名稱
1
員工的id
請求內容則包含了該名員工的信息
在我們發送請求時,沒有索引es會自動創建索引
類型
屬性
再增加幾條數據
PUT /megacorp/employee/2
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}
PUT /megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
將 HTTP 命令由 PUT 改爲 GET 可以用來檢索文檔,同樣的,可以使用 DELETE 命令來刪除文檔,以及使用 HEAD 指令來檢查文檔是否存在。如果想更新已存在的文檔,只需再次 PUT 。
3.3 查詢單條數據
GET /megacorp/employee/1
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
3.4查詢得到屬性解析
可以看到所屬
索引
類型
id
版本
(如果多次提交put就會覆蓋,就會自動更新版本,當前是1)foud 狀態標識
_source
數據
3.5 查詢全部數據
GET /megacorp/employee/_search
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_score": 1,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "2",
"_score": 1,
"_source": {
"first_name": "Jane",
"last_name": "Smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": [
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "3",
"_score": 1,
"_source": {
"first_name": "Douglas",
"last_name": "Fir",
"age": 35,
"about": "I like to build cabinets",
"interests": [
"forestry"
]
}
}
]
}
}
3.6 查詢屬性解析
{
"took": 花費時間,
"timed_out": 是否查詢超時,
"_shards": {
"total": 分片總數,
"successful": 分片成功數,
"failed": 分片失敗數
},
"hits": {
"total": 本次搜索,返回幾條結果,
"max_score": 本次搜索的所有結果中,最大的相關度分數是多少,每一條document對於search的相關度,越相關,_score分數越大,排位越靠前,
"hits": [數據]
}}
至此,簡單的插入,查詢已經完成,下一節我們通過查詢表達式搜索