您好,登錄后才能下訂單哦!
這篇文章主要介紹了ElasticSearch節(jié)點、分片、CRUD、倒排索引和分詞源碼分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇ElasticSearch節(jié)點、分片、CRUD、倒排索引和分詞源碼分析文章都會有所收獲,下面我們一起來看看吧。
ElasticSearch是非常重要的檢索工具,利用分詞、索引(倒排索引)、分詞從眾多檢索工具中脫穎而出。
ElasticSearch是面向文檔的,文檔是所有可搜索數(shù)據(jù)的最小單位
日志文件中的日志項
一本電影的具體信息 / 一張唱片的詳細信息
Mp3播放器的一首歌 / 一篇PDF文檔中的具體內容
文檔會被序列化成Josn格式,保存在ElasticSearch中
Json對象由字段組成
每個字段都有對應的字段類型(字符串/數(shù)值/布爾/日期/二進制/范圍類型)
每個文檔都有一個UniqueID
你可以自己指定ID
或者通過ElasticSearch自動生成
一篇文檔包含了一系列的字段
Json文檔,格式靈活,不需要預先定義格式
字段的類型可以指定或通過ElasticSearch自動推算
支持數(shù)組、支持嵌套
{ "_index" : ".kibana_1", "_type" : "_doc", "_id" : "space:default", "_score" : 1.0, "_source" : { "space" : { "name" : "默認值", "description" : "這是您的默認空間!", "color" : "#00bfb3", "_reserved" : true }, "type" : "space", "references" : [ ], "updated_at" : "2022-05-13T09:16:16.465Z" } }
元數(shù)據(jù),用于標注文檔的相關信息
_index : 文檔所屬的索引名
_type : 文檔所屬的類型名
_id : 文檔唯一ID
_source : 文檔的原始Json數(shù)據(jù)
_version : 文檔的版本信息
_score : 相關性打分
index :索引是文檔的容器,是一類文檔的結合
index體現(xiàn)了邏輯空間的概念,每個索引都有自己的Mapping定義,用于定義包含的文檔的字段名和字段類型
Shard 體現(xiàn)了物理空間的概念,索引中的數(shù)據(jù)分散在Shard上
索引的Mapping與Settings
Mapping定義文檔的字段類型
Setting定義不同的數(shù)據(jù)分布
//查看索引相關信息 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 //按照文檔個數(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
高可用性
服務可用性 :允許有節(jié)點停止服務
數(shù)據(jù)可用性 :部分節(jié)點丟失,不會丟失數(shù)據(jù)
可擴展性
請求量提升 / 數(shù)據(jù)的不斷增長(將數(shù)據(jù)分布都所有接點上)
elasticsearch的分布式架構的好處
存儲的水平擴容
提高系統(tǒng)的可用性,部分節(jié)點停止服務,整個集群的服務不受影響
elasticsearch的分布式架構
不同的集群通過不同的名字來區(qū)分,默認名字"elasticsearch"
通過配置文件修改,或者在命令行中-E cluster.name=stark
進行設定
一個集群可以有一個或多個節(jié)點
節(jié)點是elasticsearch的實例
本質上就是一個Java進程
一臺機器上可以運行多個elasticsearch進程,但是生產(chǎn)環(huán)境一般建議一臺機器上只運行一個elasticsearch實例
每一個節(jié)點都有名字,通過配置文件配置,或者啟動的時候-E node.name=node1指定
每一個節(jié)點在啟動之后,會分配一個UID,保存在data目錄下
主分片,用以解決數(shù)據(jù)水平擴展的問題。通過主分片,可以將數(shù)據(jù)分布到集群內的所有節(jié)點之上
一個分片是一個運行的Lucene的實例
主分片數(shù)在索引創(chuàng)建時指定,后續(xù)不允許修改,除非Reindex
副本 ,用以解決數(shù)據(jù)高可用的問題,分片是主分片的拷貝
副本分片數(shù),可以動態(tài)調整
增加副本數(shù),還可以在一定程度上提高服務的可用性
{ "settings": { "number_of_shards": 1, "number_of_replicas": 1 } }
Green - 主分片與副本都正常分配
Yellow - 主分片全部正常分配,有副本分片未能正常分片
Red - 有主分片未能分配
1.使用PostMan創(chuàng)建一個名字叫stark的索引
http://127.0.0.1:9200/stark?pretty // 返回值 { "acknowledged": true, "shards_acknowledged": true, "index": "stark" }
Type名,約定都用_doc
Create ,如果ID已經(jīng)存在,會失敗
Index ,如果ID不存在,創(chuàng)建新的文檔。否則先刪除現(xiàn)有文檔,再創(chuàng)建新的文檔,版本會增加。
Update ,文檔必須已經(jīng)存在,更新只會對相應字段做增量修改。
支持自動生成文檔ID和指定文檔ID兩種方式:
使用POST /indexName/_doc
,系統(tǒng)會自動生成Document ID
使用PUT /indexName/_create/ID
創(chuàng)建時,URI中顯示指定_create
,此時如果該ID的文檔已經(jīng)存在,操作失敗
GET http://127.0.0.1:9200/IndexName/_doc/ID
找到文檔,返回Http 200
文檔元信息,同一個ID的文檔,即使被刪除,Version號也會不斷增加
_source 中默認包含了文檔的所有原始信息
找不到文檔,返回Http 404
PUT IndexName/_doc/1 { "tags":["name","age","sex"] }
Index和Create不一樣的地方:如果文檔存在,就索引新的文檔。否則現(xiàn)有文檔會被刪除,新的文檔被索引,版本信息(Version) + 1。
Update方法不會刪除原來的文檔,而是實現(xiàn)真正的數(shù)據(jù)更新,POST方法 ,Payload需要包含在doc中。
POST IndexNmae/_update/1 { "doc":{ "albums":["aaa","bbb"] } }
DELETE IndexName/_doc/ID
Bulk Api 支持在一次Api調用中,對不同的索引進行操作,支持四種類型操作,Index\Create\Update\Delete。
可以在URI中指定Index,也可以在請求的Payload中進行,操作單挑操作失敗,并不影響其他操作,返回結果包括了每一條操作執(zhí)行的結果。
//對同一個索引進行操作 POST /IndexName/_doc/_bulk //對不同的索引進行操作 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)絡鏈接所產(chǎn)生的開銷,提高性能。
#URI中指定index GET /IndxName/_mget { "docs" : [ { "_id" : "1" }, { "_id" : "2" } ] } //對不同的索引進行操作 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}
倒排索引的核心組成
倒排索引包含兩個部分
倒排索引項
文檔ID
詞頻TF - 該單詞在文檔中出現(xiàn)的次數(shù),用于相關性評分
位置,單詞在文檔中分詞的位置,用于語句搜索
偏移,記錄單詞的開始結束位置,實現(xiàn)高亮顯示
單詞詞典一般比較大,可以通過B+樹或哈希拉鏈法實現(xiàn),以滿足高性能的插入和查詢
單詞詞典,記錄所有文檔的單詞,記錄單詞到倒排列表的關聯(lián)關系
倒排列表,記錄了單詞對應的文檔結合,由倒排索引組成
Es的倒排索引
Es的Json文檔中的每個字段,都有自己的倒排索引
可以指定對某些字段不做索引
優(yōu)點:節(jié)省存儲空間
缺點:字段無法被搜索
Analysis,文本分析是把全文本轉換成一系列單詞(term / token)的過程,也叫分詞。
Analysis 是通過 Analyzer 來實現(xiàn)的,可使用elasticsearch內置的分析器 / 或者按需定制化分析器。
除了在數(shù)據(jù)寫入時轉換詞條,匹配Query語句時候也需要用相同的分析器對查詢進行查詢語句進行分析。
分詞器是專門處理分詞的組件,Analyzer由三部分組成:
① 針對原始文本處理,例如去除html
② 按照規(guī)則切分單詞
③ 將切分的單詞進行加工,小寫,刪除stopworlds,增加同義詞
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開頭的索引
2.URI查詢
使用"q",指定字符串查詢
"query string syntax",KV鍵值對
用q表示查詢內容,搜索叫做stark的客戶GET /IndexName/_search?q=keyName:stark
3.Request Body
Request Body 支持 POST/GET兩種方法,-H代表的是header參數(shù) -d 代表的是body的請求參數(shù)。
curl -XGET "http://127.0.0.1:9200/IndexName/_search" -H 'Content-Type:application/json' -d ' { "query":{ "match_all":{} } } '
4.搜索Response
搜索Response有幾個關鍵的描述需要在這里解釋一下:
took: 花費的時間
total: 符合條件的總文檔數(shù)
hits:結果集,默認前10個文檔
_index:索引名
_id:文檔的ID
_score: 相關度評分
_source:文檔原始信息
q是關鍵字,df是指定字段,泛查詢就是查詢所有字段中包含關鍵字的結果
//指定字段 GET /IndexName/_search?q=2020&df=title GET /IndexName/_search?q=title:2020 { "profile":"true" } //泛查詢 GET /IndexName/_search?q=2020 { "profile":"true" }
Hello World 等效于 Hello Or World
"Hello World",等效于Hello AND World 。Phrase查詢,還要求前后順序保持一致
分組和引號
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" }
布爾操作
必須大寫
title:(Hello NOT World)
AND / OR / NOT 或者 && / || / !
分組
表示 must_not
表示 must
title:(+Hello -World)
//檢索title里有Hello ,沒有World的詞條 GET /IndexName/_search?q=title:(Hello NOT World) { "profile":"true" } //檢索title里必須有Hello ,必須沒有World的詞條 GET /IndexName/_search?q=title:(+Hello -World) { "profile":"true" }
URI Search支持范圍查詢和算術符號查詢。
范圍查詢
區(qū)間表示:[]閉區(qū)間,{}開區(qū)間
year:{2019 TO 2020}
year:[* TO 2020]
算數(shù)符號
year:> 2020
year:(>2010 && < 2020)
year:(+>2010 && +< 2020)
GET /IndexName/_search?q=year:>2020 { "profile":"true" }
關于“ElasticSearch節(jié)點、分片、CRUD、倒排索引和分詞源碼分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“ElasticSearch節(jié)點、分片、CRUD、倒排索引和分詞源碼分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。