本系列文章記錄,摘要,總結 對Elasticsearch 的系統學習,基于官方文檔 Elasticsearch 2.x 版本 , 内容可能過時
文章目錄
- 1. Elasticsearch 基礎概念
-
- 1.1 Elasticsearch 是什麼
- 1.2 Elasticsearch 功能
- 1.3 與Elasticsearch互動
- 2. Elasticsearch 安裝
- 3. 簡單的案例介紹
-
- 3.1 分析需求
- 3.2 插入資料
- 3.3 查詢單條資料
- 3.4查詢得到屬性解析
- 3.5 查詢全部資料
- 3.6 查詢屬性解析
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搭建之後會搭建一個可視化界面,有以下選擇(也可以再搜尋看看有沒有更好的,或者自己造一個?):
- ElasticHD
- elasticsearch-head
- dejavu
- kibana
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": [資料]
}}
至此,簡單的插入,查詢已經完成,下一節我們通過查詢表達式搜尋