當前位置: 妍妍網 > 碼農

ElasticSearch常見用法,看這一篇就夠了(文末送書)

2024-03-18碼農

2024送書福利正式起航

關註「哪咤編程」,提升Java技能

ElasticSearch是一款由Java開發的開源搜尋引擎,它以其出色的即時搜尋、穩定可靠、快速安裝和方便使用的特性,在Java開發社群中贏得了廣泛的認可和套用。

Elasticsearch為Java開發者提供了一個強大的搜尋解決方案。無論是對於小型計畫還是大型企業級套用,Elasticsearch都能提供高效的搜尋功能,幫助開發者快速檢索和處理大量數據。透過其簡單的RESTful API介面,開發者可以輕松地整合Elasticsearch到他們的Java計畫中,實作即時更新文件庫,並從文件中快速檢索出符合使用者搜尋條件的數據。

Elasticsearch的分布式特性使得它在處理海量數據時具有出色的效能。與傳統的資料庫系統相比,Elasticsearch的即時查詢處理能力更強,能夠應對大規模並行搜尋請求。同時,它還提供了靈活的伸縮性配置,可以根據搜尋數據規模的增長進行擴充套件,確保系統的穩定性和可用性。

Elasticsearch還具備全文搜尋的能力,能夠將復雜的搜尋功能如布爾查詢、短語查詢、過濾器、排序、分頁等都封裝進一個平台。這使得Java開發者能夠輕松地實作復雜的搜尋需求,提升使用者體驗和系統的功能性。

下面是ElasticSearch的基本操作樣例,學習新技術,先用起來,其它的再說~

一、索引

1、建立

1.建立索引
- PUT /索引名 ====> PUT /products
- 註意: 
1.ES中索引健康轉態 red(索引不可用) 、yellwo(索引可用,存在風險)、green(健康)
2.預設ES在建立索引時回為索引建立1個備份索引和一個primary索引
2.建立索引 進行索引分片配置
- PUT /products
{
"settings": {
"number_of_shards"1, #指定主分片的數量
"number_of_replicas"0 #指定副本分片的數量
}
}

字串型別: keyword 關鍵字 關鍵詞 、text 一段文本

數位型別:integer long

小數型別:float double

布爾型別:boolean

日期型別:date

建立索引&對映

PUT /products

"settings": {
"number_of_shards"1,
"number_of_replicas"0
}, 
"mappings": {
"properties": {
"title":{
"type""keyword"
},
"price":{
"type""double"
},
"created_at":{
"type""date"
},
"description":{
"type""text"
}
}
}
}

說明: ES中支持欄位型別非常豐富,如:text、keyword、integer、long、ip 等。更多參見https://www.elastic.co/guide/en/elasticsearch/reference/7.15/mapping-types.html

2、查詢

# 查詢索引
- GET /_cat/indices?v

// 檢視某個索引的對映
GET /索引名/_mapping =====> GET /products/_mapping

3、刪除

3.刪除索引
- DELETE /索引名 =====> DELETE /products
- DELETE /* `*代表通配符,代表所有索引`

二、文件

1、添加文件

POST /products/_doc/1 #指定文件id 
{
"title":"iphone13",
"price":8999.99,
"created_at":"2021-09-15",
"description":"iPhone 13螢幕采用6.1英寸OLED螢幕。"
}

POST /products/_doc/ #自動生成文件id
{
"title":"iphone14",
"price":8999.99,
"created_at":"2021-09-15",
"description":"iPhone 13螢幕采用6.8英寸OLED螢幕"
}

{
"_index" : "products",
"_type" : "_doc",
"_id" : "sjfYnXwBVVbJgt24PlVU",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}

2、查詢文件

GET /products/_doc/1

{
"_index" : "products",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "iphone13",
"price" : 8999.99,
"created_at" : "2021-09-15",
"description" : "iPhone 13螢幕采用6.1英寸OLED螢幕"
}
}

3、刪除文件

DELETE /products/_doc/1

{
"_index" : "products",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"result" : "deleted",
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1
}

4、更新文件

PUT /products/_doc/sjfYnXwBVVbJgt24PlVU
{
"title":"iphon15"
}

說明: 這種更新方式是先刪除原始文件,再將更新文件以新的內容插入。

POST /products/_doc/sjfYnXwBVVbJgt24PlVU/_update
{
"doc" : {
"title" : "iphon15"
}
}

說明: 這種方式可以將數據原始內容保存,並在此基礎上更新。

5、批次操作

POST /products/_doc/_bulk #批次索引兩條文件
{"index":{"_id":"1"}}
{"title":"iphone14","price":8999.99,"created_at":"2021-09-15","description":"iPhone 13螢幕采用6.8英寸OLED螢幕"}
 {"index":{"_id":"2"}}
{"title":"iphone15","price":8999.99,"created_at":"2021-09-15","description":"iPhone 15螢幕采用10.8英寸OLED螢幕"}

POST /products/_doc/_bulk #更新文件同時刪除文件
 {"update":{"_id":"1"}}
{"doc":{"title":"iphone17"}}
 {"delete":{"_id":2}}
 {"index":{}}
{"title":"iphone19","price":8999.99,"created_at":"2021-09-15","description":"iPhone 19螢幕采用61.8英寸OLED螢幕"}

說明:批次時不會因為一個失敗而全部失敗,而是繼續執行後續操作,在返回時按照執行的狀態返回!

三、高級查詢

ES中提供了一種強大的檢索數據方式,這種檢索方式稱之為Query DSL,Query DSL是利用Rest API傳遞JSON格式的請求體(Request Body)數據與ES進行互動,這種方式的豐富查詢語法讓ES檢索變得更強大,更簡潔。

1、語法

# GET /索引名/_doc/_search {json格式請求體數據}
# GET /索引名/_search {json格式請求體數據}

2、測試數據

1.建立索引 對映
PUT /products/
{
"mappings": {
"properties": {
"title":{
"type""keyword"
},
"price":{
"type""double"
},
"created_at":{
"type":"date"
},
"description":{
"type":"text"
}
}
}
}
2.測試數據
PUT /products/_doc/_bulk
{"index":{}}
{"title":"iphone12 pro","price":8999,"created_at":"2020-10-23","description":"iPhone 12 Pro采用超瓷晶面板和亞光質感玻璃背板,搭配不銹鋼邊框,有銀色、石墨色、金色、海藍色四種顏色。寬度:71.5公釐,高度:146.7公釐,厚度:7.4公釐,重量:187克"}
{"index":{}}
{"title":"iphone12","price":4999,"created_at":"2020-10-23","description":"iPhone 12 高度:146.7公釐;寬度:71.5公釐;厚度:7.4公釐;重量:162克(5.73盎司) [5] 。iPhone 12設計采用了離子玻璃,以及7000系列鋁金屬外殼。"}
{"index":{}}
{"title":"iphone13","price":6000,"created_at":"2021-09-15","description":"iPhone 13螢幕采用6.1英寸OLED螢幕;高度約146.7公釐,寬度約71.5公釐,厚度約7.65公釐,重量約173克。"}
{"index":{}}
{"title":"iphone13 pro","price":8999,"created_at":"2021-09-15","description":"iPhone 13Pro搭載A15 Bionic芯片,擁有四種配色,支持5G。有128G、256G、512G、1T可選,售價為999美元起。"}

四、常見檢索

1、查詢所有[match_all]

match_all關鍵字: 返回索引中的全部文件

GET /products/_search
{
"query": {
"match_all": {}
}
}

2、關鍵詞查詢(term)

term 關鍵字: 用來使用關鍵詞查詢

GET /products/_search
{
"query": {
"term": {
"price": {
"value"4999
}
}
 }
}

NOTE1: 透過使用term查詢得知ES中預設使用分詞器為標準分詞器(StandardAnalyzer),標準分詞器對於英文單詞分詞,對於中文單字分詞。

NOTE2: 透過使用term查詢得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 這些型別不分詞,只有text型別分詞。

3、範圍查詢[range]

range 關鍵字: 用來指定查詢指定範圍內的文件

GET /products/_search
{
"query": {
"range": {
"price": {
"gte"1400,
"lte"9999
}
}
}
}

4、字首查詢[prefix]

prefix 關鍵字: 用來檢索含有指定字首的關鍵詞的相關文件

GET /products/_search
{
"query": {
"prefix": {
"title": {
"value""ipho"
}
}
}
}

5、通配符查詢[wildcard]

wildcard 關鍵字: 通配符查詢 ? 用來匹配一個任意字元 * 用來匹配多個任意字元

GET /products/_search
{
"query": {
"wildcard": {
"description": {
"value""iphon*"
}
}
}
}

6、多id查詢[ids]

ids 關鍵字 : 值為陣列型別,用來根據一組id獲取多個對應的文件

GET /products/_search
{
"query": {
"ids": {
"values": ["verUq3wBOTjuBizqAegi","vurUq3wBOTjuBizqAegk"]
}
}
}

7、模糊查詢[fuzzy]

fuzzy 關鍵字: 用來模糊查詢含有指定關鍵字的文件

GET /products/_search
{
"query": {
"fuzzy": {
"description""iphooone"
}
}
}

註意: fuzzy 模糊查詢 最大模糊錯誤 必須在0-2之間

  1. 搜尋關鍵詞長度為 2 不允許存在模糊

  2. 搜尋關鍵詞長度為3-5 允許一次模糊

  3. 搜尋關鍵詞長度大於5 允許最大2模糊

8、布爾查詢[bool]

  1. bool 關鍵字: 用來組合多個條件實作復雜查詢

  2. must: 相當於&& 同時成立

  3. should: 相當於|| 成立一個就行

  4. must_not: 相當於! 不能滿足任何一個

GET /products/_search
{
"query": {
"bool": {
"must": [
{"term": {
"price": {
"value"4999
}
}}
]
}
}
}

9、多欄位查詢[multi_match]

GET /products/_search
{
"query": {
"multi_match": {
"query""iphone13 毫",
"fields": ["title","description"]
}
}
}
註意: 欄位型別分詞,將查詢條件分詞之後進行查詢改欄位 如果該欄位不分詞就會將查詢條件作為整體進行查詢

10、預設欄位分詞查詢[query_string]

GET /products/_search
{
"query": {
"query_string": {
"default_field""description",
"query""螢幕真的非常不錯"
}
}
}
註意: 查詢欄位分詞就將查詢條件分詞查詢 查詢欄位不分詞將查詢條件不分詞查詢

11、高亮查詢[highlight]

(1)highlight 關鍵字: 可以讓符合條件的文件中的關鍵詞高亮

GET /products/_search
{
"query": {
"term": {
"description": {
"value""iphone"
}
}
},
"highlight": {
"fields": {
"*":{}
}
}
}

(2)自訂高亮html標簽: 可以在highlight中使用pre_tags和post_tags

GET /products/_search
{
"query": {
"term": {
"description": {
"value""iphone"
}
}
},
"highlight": {
"post_tags": ["</span>"], 
"pre_tags": ["<span style='color:red'>"],
"fields": {
"*":{}
}
}
}

(3)多欄位高亮 使用require_field_match開啟多個欄位高亮

GET /products/_search
{
"query": {
"term": {
"description": {
"value""iphone"
}
}
},
"highlight": {
"require_field_match""false",
"post_tags": ["</span>"], 
"pre_tags": ["<span style='color:red'>"],
"fields": {
"*":{}
}
}
}

12、返回指定條數[size]

size 關鍵字: 指定查詢結果中返回指定條數。 預設返回值10條

GET /products/_search
{
"query": {
"match_all": {}
},
"size"5
}

13、分頁查詢[form]

from 關鍵字: 用來指定起始返回位置,和size關鍵字連用可實作分頁效果

GET /products/_search
{
"query": {
"match_all": {}
},
"size"5,
"from"0
}

14、指定欄位排序[sort]

GET /products/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order""desc"
}
}
]
}

15、返回指定欄位[_source]

_source 關鍵字: 是一個陣列,在陣列中用來指定展示那些欄位

GET /products/_search
{
"query": {
"match_all": {}
},
"_source": ["title","description"]
}

五、一本書講透Elasticsearch:原理、進階與工程實踐

這是一本關於Elasticsearch技術實戰的教程,全面覆蓋了Elastic Stack技術體系知識,旨在幫助讀者深入了解Elasticsearch的核心技術和套用場景,同時掌握分布式搜尋與分析引擎的設計思想和實作原理。

本書共20章,分為4大部份:

第1部份Elastic Stack全域概覽(第1~3章) :主要討論Elastic Stack的重要組成部份與套用場景,以及Elasticsearch的獨特優勢。同時,初步探索搜尋引擎的基礎知識及Elasticsearch的核心概念,如集群、節點、索引等。最後,詳細介紹Elasticsearch單節點、多節點集群部署以及Kibana部署等內容。

第2部份Elasticsearch核心技術(第4~14章) :從從底層原理和實作方法兩個層面切入,深入解讀索引、對映、分詞、數據預處理、文件、指令碼、檢索、聚合、集群、安全和運維等核心

第3部份Elasticsearch進階指南(第15~17章) :主要討論Elasticsearch各關鍵操作的基本原理、效能最佳化方案及實戰「避坑」指南等進階話題。不僅對文件版本沖突及並行控制策略,以及更新/刪除、寫入、段合並、檢索等常見操作實作提供了解決方案,還從通用、寫入、檢索3個維度提供了效能最佳化建議,並且討論了分片、執行緒池和佇列、熱點執行緒、集群規劃、客戶端選型、緩存、數據建模、效能測試等熱點技術,提供了Elasticsearch的套用場景和最佳化方法,為企業級實戰保駕護航。

第4部份 Elasticsearch計畫實戰(第18~20章) :帶領讀者將實戰Elasticsearch三大核心業務場景——知識庫檢索系統、大數據視覺化系統、日誌系統,融會貫通理論知識和實踐技能。


留言送書


關於ElasticSearch,想必每個人都有自己的心得體會,歡迎大家在留言區分享,今天就給大家送【一本書講透Elasticsearch:原理、進階與工程實踐】了

1樓、2樓、5樓、10樓可分別獲得一本

評論最走心人士,額外再送一本

(包郵到家哦~🍊)

活動截止時間:3月20日 21:00

·················END·················

2024送書福利正式起航

關註「哪咤編程」,提升Java技能

ElasticSearch真 不錯↓