搜索一文入門ElasticSearch(節(jié)點(diǎn) 分片 CRUD 倒排索引 分詞)
ElasticSearch
ElasticSearch是非常重要的檢索工具,利用分詞、索引(倒排索引)、分詞從眾多檢索工具中脫穎而出,本章是入門基礎(chǔ)學(xué)習(xí)篇內(nèi)容。
基本概念:索引、文檔和REST Api
ElasticSearch是面向文檔的,文檔是所有可搜索數(shù)據(jù)的最小單位
- 日志文件中的日志項(xiàng)
- 一本電影的具體信息 / 一張唱片的詳細(xì)信息
- Mp3播放器的一首歌 / 一篇PDF文檔中的具體內(nèi)容
文檔會(huì)被序列化成Josn格式,保存在ElasticSearch中
- Json對(duì)象由字段組成
- 每個(gè)字段都有對(duì)應(yīng)的字段類型(字符串/數(shù)值/布爾/日期/二進(jìn)制/范圍類型)
每個(gè)文檔都有一個(gè)UniqueID
你可以自己指定ID
或者通過(guò)ElasticSearch自動(dòng)生成
Json文檔
- 一篇文檔包含了一系列的字段
- Json文檔,格式靈活,不需要預(yù)先定義格式
- 字段的類型可以指定或通過(guò)ElasticSearch自動(dòng)推算
- 支持?jǐn)?shù)組、支持嵌套
文檔的元數(shù)據(jù)
{ "_index" : ".kibana_1", "_type" : "_doc", "_id" : "space:default", "_score" : 1.0, "_source" : { "space" : { "name" : "默認(rèn)值", "description" : "這是您的默認(rèn)空間!", "color" : "#00bfb3", "_reserved" : true }, "type" : "space", "references" : [ ], "updated_at" : "2022-05-13T09:16:16.465Z" } }
- 元數(shù)據(jù),用于標(biāo)注文檔的相關(guān)信息
- _index : 文檔所屬的索引名
- _type : 文檔所屬的類型名
- _id : 文檔唯一ID
- _source : 文檔的原始Json數(shù)據(jù)
- _version : 文檔的版本信息
- _score : 相關(guān)性打分
索引
- index :索引是文檔的容器,是一類文檔的結(jié)合
- index體現(xiàn)了邏輯空間的概念,每個(gè)索引都有自己的Mapping定義,用于定義包含的文檔的字段名和字段類型
- Shard 體現(xiàn)了物理空間的概念,索引中的數(shù)據(jù)分散在Shard上
- 索引的Mapping與Settings
- Mapping定義文檔的字段類型
- Setting定義不同的數(shù)據(jù)分布
//查看索引相關(guān)信息 GET kibana_sample_data_ecommerce //查看索引的文檔總數(shù) GET kibana_sample_data_ecommerce/_count //查看前10條文檔,了解文檔格式 POST kibana_sample_data_ecommerce/_search { } //_cat indices API //查看indices GET /_cat/indices/kibana*?v&s=index //查看狀態(tài)為綠的索引 GET /_cat/indices?v&health=green //按照文檔個(gè)數(shù)排序 GET /_cat/indices?v&s=docs.count:desc //查看具體的字段 GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt //How much memory is used per index? GET /_cat/indices?v&h=i,tm&s=tm:desc
分布式系統(tǒng)的可用性和擴(kuò)展性
- 高可用性
- 服務(wù)可用性 :允許有節(jié)點(diǎn)停止服務(wù)
- 數(shù)據(jù)可用性 :部分節(jié)點(diǎn)丟失,不會(huì)丟失數(shù)據(jù)
- 可擴(kuò)展性
- 請(qǐng)求量提升 / 數(shù)據(jù)的不斷增長(zhǎng)(將數(shù)據(jù)分布都所有接點(diǎn)上)
分布式特性
- elasticsearch的分布式架構(gòu)的好處
- 存儲(chǔ)的水平擴(kuò)容
- 提高系統(tǒng)的可用性,部分節(jié)點(diǎn)停止服務(wù),整個(gè)集群的服務(wù)不受影響
- elasticsearch的分布式架構(gòu)
- 不同的集群通過(guò)不同的名字來(lái)區(qū)分,默認(rèn)名字"elasticsearch"
- 通過(guò)配置文件修改,或者在命令行中
-E cluster.name=stark
進(jìn)行設(shè)定 - 一個(gè)集群可以有一個(gè)或多個(gè)節(jié)點(diǎn)
節(jié)點(diǎn)
- 節(jié)點(diǎn)是elasticsearch的實(shí)例
- 本質(zhì)上就是一個(gè)Java進(jìn)程
- 一臺(tái)機(jī)器上可以運(yùn)行多個(gè)elasticsearch進(jìn)程,但是生產(chǎn)環(huán)境一般建議一臺(tái)機(jī)器上只運(yùn)行一個(gè)elasticsearch實(shí)例
- 每一個(gè)節(jié)點(diǎn)都有名字,通過(guò)配置文件配置,或者啟動(dòng)的時(shí)候
-E node.name=node1指定
- 每一個(gè)節(jié)點(diǎn)在啟動(dòng)之后,會(huì)分配一個(gè)UID,保存在data目錄下
分片
- 主分片,用以解決數(shù)據(jù)水平擴(kuò)展的問(wèn)題。通過(guò)主分片,可以將數(shù)據(jù)分布到集群內(nèi)的所有節(jié)點(diǎn)之上
- 一個(gè)分片是一個(gè)運(yùn)行的Lucene的實(shí)例
- 主分片數(shù)在索引創(chuàng)建時(shí)指定,后續(xù)不允許修改,除非Reindex
- 副本 ,用以解決數(shù)據(jù)高可用的問(wèn)題,分片是主分片的拷貝
- 副本分片數(shù),可以動(dòng)態(tài)調(diào)整
- 增加副本數(shù),還可以在一定程度上提高服務(wù)的可用性
{ "settings": { "number_of_shards": 1, "number_of_replicas": 1 } }
查看集群的健康狀況
- Green - 主分片與副本都正常分配
- Yellow - 主分片全部正常分配,有副本分片未能正常分片
- Red - 有主分片未能分配
CRUD
1.使用PostMan創(chuàng)建一個(gè)名字叫stark的索引
http://127.0.0.1:9200/stark?pretty // 返回值 { "acknowledged": true, "shards_acknowledged": true, "index": "stark" }
文檔的CRUD
- Type名,約定都用_doc
- Create ,如果ID已經(jīng)存在,會(huì)失敗
- Index ,如果ID不存在,創(chuàng)建新的文檔。否則先刪除現(xiàn)有文檔,再創(chuàng)建新的文檔,版本會(huì)增加。
- Update ,文檔必須已經(jīng)存在,更新只會(huì)對(duì)相應(yīng)字段做增量修改。
Create 一個(gè)文檔
支持自動(dòng)生成文檔ID和指定文檔ID兩種方式:
- 使用
POST /indexName/_doc
,系統(tǒng)會(huì)自動(dòng)生成Document ID - 使用
PUT /indexName/_create/ID
創(chuàng)建時(shí),URI中顯示指定_create
,此時(shí)如果該ID的文檔已經(jīng)存在,操作失敗
GET 一個(gè)文檔
GET http://127.0.0.1:9200/IndexName/_doc/ID
- 找到文檔,返回Http 200
- 文檔元信息,同一個(gè)ID的文檔,即使被刪除,Version號(hào)也會(huì)不斷增加
- _source 中默認(rèn)包含了文檔的所有原始信息
- 找不到文檔,返回Http 404
Index 文檔
PUT IndexName/_doc/1 { "tags":["name","age","sex"] }
Index和Create不一樣的地方:如果文檔存在,就索引新的文檔。否則現(xiàn)有文檔會(huì)被刪除,新的文檔被索引,版本信息(Version) + 1。
Update 文檔
Update方法不會(huì)刪除原來(lái)的文檔,而是實(shí)現(xiàn)真正的數(shù)據(jù)更新,POST方法 ,Payload需要包含在doc中。
POST IndexNmae/_update/1 { "doc":{ "albums":["aaa","bbb"] } }
刪除文檔
DELETE IndexName/_doc/ID
Bulk API / 批量讀取 mGet / 批量查詢 msearch
Bulk Api 支持在一次Api調(diào)用中,對(duì)不同的索引進(jìn)行操作,支持四種類型操作,Index\Create\Update\Delete。
可以在URI中指定Index,也可以在請(qǐng)求的Payload中進(jìn)行,操作單挑操作失敗,并不影響其他操作,返回結(jié)果包括了每一條操作執(zhí)行的結(jié)果。
//對(duì)同一個(gè)索引進(jìn)行操作 POST /IndexName/_doc/_bulk //對(duì)不同的索引進(jìn)行操作 POST _bulk { "index" : { "_index" : "test", "_id" : "1" } } { "field1" : "value1" } { "delete" : { "_index" : "test", "_id" : "2" } } { "create" : { "_index" : "test2", "_id" : "3" } } { "field1" : "value3" } { "update" : {"_id" : "1", "_index" : "test"} } { "doc" : {"field2" : "value2"} }
mGet批量操作,可以減少網(wǎng)絡(luò)鏈接所產(chǎn)生的開(kāi)銷,提高性能。
#URI中指定index GET /IndxName/_mget { "docs" : [ { "_id" : "1" }, { "_id" : "2" } ] } //對(duì)不同的索引進(jìn)行操作 GET /_mget { "docs" : [ { "_index" : "test", "_id" : "1" }, { "_index" : "test", "_id" : "2" } ] }
批量查詢 msearch
// msearch 操作 POST kibana_sample_data_ecommerce/_msearch {"query" : {"match_all" : {}},"size":1} {"index" : "kibana_sample_data_flights"} {"query" : {"match_all" : {}},"size":2}
倒排索引
倒排索引的核心組成
- 倒排索引包含兩個(gè)部分
- 單詞詞典,記錄所有文檔的單詞,記錄單詞到倒排列表的關(guān)聯(lián)關(guān)系
- 單詞詞典一般比較大,可以通過(guò)B+樹(shù)或哈希拉鏈法實(shí)現(xiàn),以滿足高性能的插入和查詢
- 倒排列表,記錄了單詞對(duì)應(yīng)的文檔結(jié)合,由倒排索引組成
- 倒排索引項(xiàng)
- 文檔ID
- 詞頻TF - 該單詞在文檔中出現(xiàn)的次數(shù),用于相關(guān)性評(píng)分
- 位置,單詞在文檔中分詞的位置,用于語(yǔ)句搜索
- 偏移,記錄單詞的開(kāi)始結(jié)束位置,實(shí)現(xiàn)高亮顯示
- 倒排索引項(xiàng)
- 單詞詞典,記錄所有文檔的單詞,記錄單詞到倒排列表的關(guān)聯(lián)關(guān)系
Es的倒排索引
- Es的Json文檔中的每個(gè)字段,都有自己的倒排索引
- 可以指定對(duì)某些字段不做索引
- 優(yōu)點(diǎn):節(jié)省存儲(chǔ)空間
- 缺點(diǎn):字段無(wú)法被搜索
Analysis 與 Analyzer
- Analysis,文本分析是把全文本轉(zhuǎn)換成一系列單詞(term / token)的過(guò)程,也叫分詞。
- Analysis 是通過(guò) Analyzer 來(lái)實(shí)現(xiàn)的,可使用elasticsearch內(nèi)置的分析器 / 或者按需定制化分析器。
- 除了在數(shù)據(jù)寫(xiě)入時(shí)轉(zhuǎn)換詞條,匹配Query語(yǔ)句時(shí)候也需要用相同的分析器對(duì)查詢進(jìn)行查詢語(yǔ)句進(jìn)行分析。
Analyzer的組成
- 分詞器是專門處理分詞的組件,Analyzer由三部分組成:
- ① 針對(duì)原始文本處理,例如去除html
- ② 按照規(guī)則切分單詞
- ③ 將切分的單詞進(jìn)行加工,小寫(xiě),刪除stopworlds,增加同義詞
Search Api
- URI Search ,在URL中使用查詢參數(shù)
- Request Body Search ,使用es提供的,基于Json格式的更加完備的Query Domain Specific Language(DSL)
1.指定查詢的索引
集群上所有的索引:
GET /_search //集群上所有的索引 GET /Index1/_search //index1 GET /Index1,Index2/_search //index1和index2 GET /index*/_search //以index開(kāi)頭的索引
2.URI查詢
- 使用"q",指定字符串查詢
- "query string syntax",KV鍵值對(duì)
用q表示查詢內(nèi)容,搜索叫做stark的客戶GET /IndexName/_search?q=keyName:stark
3.Request Body
Request Body 支持 POST/GET兩種方法,-H代表的是header參數(shù) -d 代表的是body的請(qǐng)求參數(shù)。
curl -XGET "http://127.0.0.1:9200/IndexName/_search" -H 'Content-Type:application/json' -d ' { "query":{ "match_all":{} } } '
4.搜索Response
搜索Response有幾個(gè)關(guān)鍵的描述需要在這里解釋一下:
- took: 花費(fèi)的時(shí)間
- total: 符合條件的總文檔數(shù)
- hits:結(jié)果集,默認(rèn)前10個(gè)文檔
- _index:索引名
- _id:文檔的ID
- _score: 相關(guān)度評(píng)分
- _source:文檔原始信息
URI Search詳解
指定字段查詢 Vs 泛查詢
q是關(guān)鍵字,df是指定字段,泛查詢就是查詢所有字段中包含關(guān)鍵字的結(jié)果
//指定字段 GET /IndexName/_search?q=2020&df=title GET /IndexName/_search?q=title:2020 { "profile":"true" } //泛查詢 GET /IndexName/_search?q=2020 { "profile":"true" }
Term Vs Phrase
Hello World 等效于 Hello Or World
"Hello World",等效于Hello AND World 。Phrase查詢,還要求前后順序保持一致
分組和引號(hào)
- title:(Hello AND World)
- title = "Hello World"
//分組,Bool查詢 GET /IndexName/_search?q=title:(Hello World) { "profile":"true" } //泛查詢 GET /IndexName/_search?q=title:Hello World { "profile":"true" }
布爾操作 、分組
- 布爾操作
- AND / OR / NOT 或者 && / || / !
- 必須大寫(xiě)
- title:(Hello NOT World)
- AND / OR / NOT 或者 && / || / !
- 分組
- 表示 must
- 表示 must_not
- title:(+Hello -World)
//檢索title里有Hello ,沒(méi)有World的詞條 GET /IndexName/_search?q=title:(Hello NOT World) { "profile":"true" } //檢索title里必須有Hello ,必須沒(méi)有World的詞條 GET /IndexName/_search?q=title:(+Hello -World) { "profile":"true" }
范圍查詢 、算術(shù)符號(hào)
URI Search支持范圍查詢和算術(shù)符號(hào)查詢。
- 范圍查詢
- 區(qū)間表示:[]閉區(qū)間,{}開(kāi)區(qū)間
- year:{2019 TO 2020}
- year:[* TO 2020]
- 算數(shù)符號(hào)
- year:> 2020
- year:(>2010 && < 2020)
- year:(+>2010 && +< 2020)
GET /IndexName/_search?q=year:>2020 { "profile":"true" }
通配符查詢 、正則表達(dá)式 、模糊匹配與近似查詢
通配符查詢 、正則表達(dá)式 、模糊匹配與近似查詢效率低,占用內(nèi)存大,不建議使用,這部分大家有個(gè)了解就好。
以上就是搜索一文入門ElasticSearch(節(jié)點(diǎn) 分片 CRUD 倒排索引 分詞)的詳細(xì)內(nèi)容,更多關(guān)于ElasticSearch搜索入門的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java如何將int數(shù)組轉(zhuǎn)化為Integer數(shù)組
這篇文章主要介紹了java如何將int數(shù)組轉(zhuǎn)化為Integer數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11詳解Java中如何定義和訪問(wèn)靜態(tài)字段和方法
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,我們通常使用類來(lái)創(chuàng)建對(duì)象,類中有許多成員變量和方法,它們是直接屬于對(duì)象實(shí)例的,與之對(duì)應(yīng)的還有一類成員,那就是靜態(tài)成員,本文就來(lái)和大家聊聊Java是如何定義訪問(wèn)靜態(tài)成員的吧2023-05-05一文帶你熟練掌握J(rèn)ava中的日期時(shí)間相關(guān)類
我們?cè)陂_(kāi)發(fā)時(shí),除了數(shù)字、數(shù)學(xué)這樣的常用API之外,還有日期時(shí)間類,更是會(huì)被經(jīng)常使用,比如我們項(xiàng)目中必備的日志功能,需要記錄異常等信息產(chǎn)生的時(shí)間,本文就帶各位來(lái)學(xué)習(xí)一下相關(guān)的日期時(shí)間類有哪些2023-05-05SSH框架網(wǎng)上商城項(xiàng)目第3戰(zhàn)之使用EasyUI搭建后臺(tái)頁(yè)面框架
SSH框架網(wǎng)上商城項(xiàng)目第3戰(zhàn)之使用EasyUI搭建后臺(tái)頁(yè)面框架,討論兩種搭建方式:基于frameset和基于easyUI,感興趣的小伙伴們可以參考一下2016-05-05JAVA基于數(shù)組實(shí)現(xiàn)的商品信息查詢功能示例
這篇文章主要介紹了JAVA基于數(shù)組實(shí)現(xiàn)的商品信息查詢功能,結(jié)合實(shí)例形式詳細(xì)分析了java使用數(shù)組存儲(chǔ)數(shù)據(jù)實(shí)現(xiàn)的商品信息查詢功能相關(guān)操作技巧,需要的朋友可以參考下2019-11-11