ElasticSearch學習
- 一、搜尋與ElasticSearch
-
- 1、什麼是搜尋
- 2、資料庫搜尋
- 3、什麼是全文檢索和Lucene
- 4、什麼是ElasticSearch
- 5、ElasticSearch的功能、适用場景、特點
- 6、ElasticSearch的核心概念
- 7、ElasticSearch、Kibana的安裝、啟動(兩者版本要一樣)
- 二、快速入門案例實戰之電商網站商品管理
-
- 1、叢集健康檢查、 CRUD操作(所有指令區分大小寫)
- 2、多種搜尋方式
一、搜尋與ElasticSearch
1、什麼是搜尋
在任何場景下,找尋你想要的資訊,這個時候,會輸入一段你要搜尋的關鍵字,然後就期望找到這個關鍵字相關的有些資訊
2、資料庫搜尋
缺點:
1)每條記錄的指定字段文本可能會很長,需要對每條記錄的所有文本進行掃描,來判斷說是否符合;太耗時耗資源
2)還不能将搜尋詞拆分開來;比如輸入“生化機”,就搜尋不出來“生化危機”
3、什麼是全文檢索和Lucene
1)全文檢索:
反向索引
2)lucene:
就是一個jar包
;裡面包含了封裝好的各種建立反向索引,以及進行搜尋的代碼,包括各種算法。我們就用java開發的時候,引入lucene jar,然後基于lucene的api進行去進行開發就可以了。用lucene,我們就可以去将已有的資料建立索引,lucene會在本地磁盤上面,給我們組織索引的資料結構。另外的話,我們也可以用lucene提供的一些功能和api來針對磁盤上的索引資料來進行搜尋
4、什麼是ElasticSearch
一個分布式,高性能,高可用,可伸縮的
搜尋和分析系統
5、ElasticSearch的功能、适用場景、特點
1)ElasticSearch的功能:
(1)分布式的搜尋引擎和資料分析引擎
(2)全文檢索,結構化檢索,資料分析
(3)對海量資料進行近實時的處理
2)ElasticSearch的适用場景:
(1)百度百科
(2)新聞網站
(3)電商網站
。
。
。
3)ElasticSearch的特點:
(1)可作為
分布式叢集
,也可作為
單機
服務小系統
(2)
并非新技術
,而是将全文檢索、分布式、資料分析等技術合并在一起的一種技術;如同SpringCloud
(3)對使用者來說,是可以
開箱即用
的;部署簡單,操作簡單
(4)提供了傳統資料庫所欠缺的一些功能;如:近實時性、海量資料、資料分析、全文檢索、同義詞處理、相關度排名等等
6、ElasticSearch的核心概念
1)Lucene和ElasticSearch的前世今生:
(1)Lucene:最先進、功能最強大的搜尋庫,直接基于Lucene開發,非常複雜,api複雜(實作一些簡單的功能,寫大量的java代碼),需要深入了解原理(各種索引結構)
(2)ElasticSearch:
基于Lucene
,隐藏複雜性,提供簡單易用的restful api接口、java api接口(還有其他語言的api接口)
分布式的文檔存儲引擎
分布式的搜尋引擎和分析引擎
分布式,支援PB級資料
開箱即用,優秀的預設參數,
不需要任何額外設定,完全開源
關于Elasticsearch的一個 傳說 (發展):
有一個程式員失業了,陪着自己老婆去英國倫敦學習廚師課程。程式員在失業期間想給老婆寫一個菜單搜尋引擎,覺得Lucene實在太複雜了,就開發了一個封裝了Lucene的開源項目,Compass。後來程式員找到了工作,是做分布式的高性能項目的,覺得Compass不夠,就寫了ElasticSearch,讓Lucene變成分布式的系統。
2)ElasticSearch的
核心概念
:
(1)Near Realtime(NRT):近實時;兩個意思:從寫入資料到資料可以被搜尋到有一個小延遲(大概1秒),基于es執行搜尋和分析可以達到秒級
近實時第一種情況的圖解
:
(2)Cluster:
叢集
,包含多個節點,每個節點屬于哪個叢集是通過一個配置(叢集名稱,預設是elasticsearch)來決定的,對于中小型應用來說,剛開始一個叢集就一個節點很正常
(3)Node:
節點
,叢集中的一個節點,節點也有一個名稱(預設是随機配置設定的),節點名稱很重要(在執行運維管理操作的時候),預設節點會去加入一個名稱為“elasticsearch”的叢集,如果直接啟動一堆節點,那麼它們會自動組成一個ElasticSearch叢集,當然一個節點也可以組成一個ElasticSearch叢集
(4)Document & Field:
文檔 & 字段
,es中的最小資料單元,一個Document可以是一條客戶資料,一條訂單資料,通常用JSON結構表示。一個Document裡有多個Field,每個Field就是一個資料字段。
(5)Index:
索引
,包含一堆有相似結構的文檔資料,比如可以有一個客戶索引,訂單索引。一個Index包含很多Document,一個Index就代表了一類類似的或者相同的Document。
(6)Type:
類型,es7.x版本中被移除了此概念
。每個索引裡都可以有一個或多個Type,Type是Index中的一個邏輯資料分類,一個Type下的Document,都有相同的Field。比如部落格系統,有一個索引,可以定義使用者資料Type,部落格資料Type,評論資料Type。
商品Type可以有:日化商品Type,電器商品Type,生鮮商品Type
日化商品Type:product_id,product_name,product_desc,category_id,category_name
電器商品Type:product_id,product_name,product_desc,category_id,category_name,service_period
生鮮商品Type:product_id,product_name,product_desc,category_id,category_name,eat_period
每一個Type裡面,都會包含一堆Document
(7)Shard:
本名為Primary Shard
。單台機器無法存儲大量資料,es可以将一個索引中的資料切分為多個Shard,分布在多台伺服器上存儲。有了Shard就可以橫向擴充,存儲更多資料,讓搜尋和分析等操作分布到多台伺服器上去執行,提升吞吐量和性能。
(8)Replica:
本名為Replica Shard
。任何一個伺服器随時可能故障或當機,此時Shard可能就會丢失,是以可以為每個Shard建立多個Replica副本。Replica可以在Shard故障時提供備用服務,保證資料不丢失,多個Replica還可以提升搜尋操作的吞吐量和性能。Primary Shard(建立索引時一次設定,不能修改,預設5個),Replica Shard(随時修改數量,預設1個),預設每個索引10個Shard,5個Primary Shard,5個Replica Shard,
最小的高可用配置,是2台伺服器
。
Shard 與 Replica 的圖解
:
3)ElasticSearch與資料庫的概念比較:
ElasticSearch | 資料庫 |
---|---|
Field | 字段 |
Document | 行 |
Type | 表 |
Index | 庫 |
7、ElasticSearch、Kibana的安裝、啟動(兩者版本要一樣)
1)安裝JDK,至少1.8.0_73以上版本,java -version
2)下載下傳和解壓縮ElasticSearch安裝包,目錄結構
3)啟動Elasticsearch:進入ElasticSearch檔案的bin路徑下,運作
elasticsearch.bat
。es本身特點之一就是開箱即用,如果是中小型應用,資料量少,操作不是很複雜,直接啟動就可以用了
4)檢查ES是否啟動成功:http://localhost:9200/?pretty
name: 節點名稱
cluster_name: 叢集名稱(預設的叢集名稱就是elasticsearch)
version.number: es版本号
{
"name": "4onsTYV",
"cluster_name": "elasticsearch",
"cluster_uuid": "nKZ9VK_vQdSQ1J0Dx9gx1Q",
"version": {
"number": "5.2.0",
"build_hash": "24e05b9",
"build_date": "2017-01-24T19:52:35.800Z",
"build_snapshot": false,
"lucene_version": "6.4.0"
},
"tagline": "You Know, for Search"
}
5)修改叢集名稱:config檔案夾的
elasticsearch.yml
檔案
6)下載下傳和解壓縮Kibana安裝包,使用裡面的開發界面,去操作ElasticSearch,作為我們學習es知識點的一個主要的界面入口
7)啟動Kibana:進入Kibana檔案的bin路徑下,運作
kibana.bat
。
8)進入Dev Tools界面:http://localhost:5601
9)GET _cluster/health:擷取ElasticSearch的運作健康狀況
二、快速入門案例實戰之電商網站商品管理
1、叢集健康檢查、 CRUD操作(所有指令區分大小寫)
1)Document資料格式:
json格式
(1)應用系統的資料結構都是面向對象的,複雜的
(2)對象資料存儲到資料庫中,隻能拆解開來,變為扁平的多張表,每次查詢的時候還得還原回對象格式,相當麻煩
(3)ES是面向文檔的,文檔中存儲的資料結構,與面向對象的資料結構是一樣的,基于這種文檔資料結構,ES可以提供複雜的索引,全文檢索,分析聚合等功能
(4)ES的Document用json資料格式來表達
2)電商網站商品管理案例背景介紹:
有一個電商網站,需要為其基于ES建構一個背景系統,提供以下功能:
(1)對商品資訊進行CRUD(增删改查)操作
(2)執行簡單的結構化查詢
(3)可以執行簡單的全文檢索,以及複雜的phrase(短語)檢索
(4)對于全文檢索的結果,可以進行高亮顯示
(5)對資料進行簡單的聚合分析
3)簡單的叢集管理
(1)快速檢查叢集的健康狀況:
- ES提供了一套api,叫做
cat api
,可以檢視ES中各種各樣的資料
如何快速了解叢集的健康狀況?GET /_cat/health?v
green、yellow、red
?
green:每個索引的Primary Shard和Replica Shard都是啟動活躍(active)狀态的
yellow:每個索引的Primary Shard都是啟動活躍(active)狀态的,但是部分Replica Shard不是啟動活躍(active)狀态,處于不可用的狀态
red:不是所有索引的Primary Shard都是啟動活躍(active)狀态的,部分索引有資料丢失了
5.x版本:啟動一個ES,預設生成
索引;一個
要求需要
有Replica Shard
7.x版本:啟動一個ES,預設生成
索引;三個
有Replica Shard不需要
啟動一台ES:用shards(即Shards)減去pri(Primary Shard),就是Replica Shard。
三者均為實際啟動了的
epoch | timestamp | cluster | status | node.total | node.data | shards | pri | relo | init | unassign | pending_tasks | max_task_wait_time | active_shards_percent |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1584755228 | 01:47:08 | elasticsearch | green | 1 | 1 | 3 | 3 | - | 100.0% |
啟動涼台ES:用shards(即Shards)減去pri(Primary Shard),就是Replica Shard。
三者均為實際啟動了的
epoch | timestamp | cluster | status | node.total | node.data | shards | pri | relo | init | unassign | pending_tasks | max_task_wait_time | active_shards_percent |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1584756567 | 02:09:27 | elasticsearch | green | 2 | 3 | 6 | 3 | - | 100.0% |
- 快速檢視叢集中的索引:
啟動一台ES:用pri(Primary Shard)加上rep(Replica Shard),就是Shards。GET /_cat/indices?v
三者均為需要啟動的
health | status | index | uuid | pri | rep | docs.count | docs.deleted | store.size | pri.store.size |
---|---|---|---|---|---|---|---|---|---|
green | open | .kibana_task_manager_1 | UNGZfmkTRE-izXImlR-qow | 1 | 2 | 1 | 26.8kb | 26.8kb | |
green | open | .apm-agent-configuration | SOvLxZQfTWKQJrd1eRo-sw | 1 | 283b | 283b | |||
green | open | .kibana_1 | V4X36I1ZQ3-wZozP2JPMUQ | 1 | 22 | 10 | 47.6kb | 47.6kb |
啟動兩台ES:用pri(Primary Shard)加上rep(Replica Shard),就是Shards。
三者均為需要啟動的
health | status | index | uuid | pri | rep | docs.count | docs.deleted | store.size | pri.store.size |
---|---|---|---|---|---|---|---|---|---|
green | open | .kibana_task_manager_1 | UNGZfmkTRE-izXImlR-qow | 1 | 1 | 2 | 1 | 53.7kb | 26.8kb |
green | open | .apm-agent-configuration | SOvLxZQfTWKQJrd1eRo-sw | 1 | 1 | 283b | 283b | ||
green | open | .kibana_1 | V4X36I1ZQ3-wZozP2JPMUQ | 1 | 1 | 22 | 10 | 101.9kb | 50.9kb |
-
簡單的索引操作
建立索引:
删除索引:PUT /test_index?pretty
DELETE /test_index?pretty
4)Document的CRUD操作:
(1)新增Document:ES會
index,不需要提前建立,而且ES預設會對Document每個Field都自動建立
,讓其可以被搜尋建立反向索引
PUT /{index}/_doc/{id}
{
"json資料"
}
(2)删除Document:
DELETE /{index}/_doc/{id}
(3)修改Document:
替換Document:替換方式有一個不好,即使
必須帶上所有的Field
,才能去進行資訊的修改
PUT /{index}/_doc/{id}
{
"json資料"
}
更新Document:
POST /{index}/_doc/{id}
{
"json資料"
}
(4)查詢Document:
GET /{index}/_doc/{id}
2、多種搜尋方式
事先了解搜尋的結果結構
:
took:耗費了幾毫秒
timed_out:是否逾時,這裡是沒有
_shards:資料拆成了1個分片,是以對于搜尋請求,會打到所有的Primary Shard(或者是它的某個Replica Shard也可以)
hits.total:查詢結果的數量,1個Document
hits.max_score:score的含義,就是Document對于一個search的相關度的比對分數,越相關,就越比對,分數也高
hits.hits:包含了比對搜尋的Document的詳細資料
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "_doc",
"_id": "1",
"_score": 1,
"_source": {
"name": "chengqb",
"desc": "ceshi",
"price": 30,
"producer": "gaolujie producer",
"tags": [
"meibai",
"fangzhu"
]
}
}
]
}
}
1)query string search:
适用于指令行界面
GET /{index}/_search
參數處理:search參數都是以http請求的query string來附帶的
如:搜尋商品名稱中包含yagao的商品,而且按照售價降序排序:
GET /{index}/_search?q=name:yagao&sort=price:desc
适用場景:适用于臨時的在指令行使用一些工具,比如curl,快速的送出請求,來檢索想要的資訊;但是如果查詢請求很複雜,是很難去建構的
在生産環境中,
幾乎很少使用query string search
2)query DSL:
适用于生産環境
DSL
:Domain Specified Language,特定領域的語言
http request body
:請求體,可以用json的格式來建構查詢文法,比較友善,可以建構各種複雜的文法
-
:查詢所有Document
GET /{index}/_search
{
"query": { "match_all": {} }
}
-
:條件查詢并排序
GET /{index}/_search
{
"query" : {
"match" : {
{Field} : {value}
}
},
"sort": [
{
{Field} : "desc" / "asc"
}
]
}
-
:分頁查詢
GET /{index}/_search
{
"query": { "match_all": {} },
"from": {value},
"size": {value}
}
-
:指定傳回字段
GET /{index}/_search
{
"query": { "match_all": {} },
"_source": [{Field}]
}
3)query filter:
GET /{index}/_search
{
"query" : {
"bool" : {
"must" : {
"match" : {
{Field} : {value}
}
},
"filter" : {
"range" : {
{Field} : { "gt" : {value}}
}
}
}
}
}
4)full-text search(全文檢索):
建立反向索引,搜尋詞也會被拆解,可以隻包含被拆解後的幾部分(一部分以上)
GET /{index}/_search
{
"query" : {
"match" : {
{Field} : {value}
}
}
}
5)phrase search(短語搜尋):
搜尋詞不會被拆解,必須包含一模一樣的
GET /{index}/_search
{
"query" : {
"match_phrase" : {
{Field} : {value}
}
}
}
6)highlight search(高亮搜尋):
高亮搜尋結果
GET /{index}/_search
{
"query" : {
"match" : {
{Field} : {value}
}
},
"highlight": {
"fields" : {
{Field} : {}
}
}
}