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之間
搜尋關鍵詞長度為 2 不允許存在模糊
搜尋關鍵詞長度為3-5 允許一次模糊
搜尋關鍵詞長度大於5 允許最大2模糊
8、布爾查詢[bool]
bool 關鍵字: 用來組合多個條件實作復雜查詢
must: 相當於&& 同時成立
should: 相當於|| 成立一個就行
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真 不錯↓