溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ElasticSearch節(jié)點、分片、CRUD、倒排索引和分詞源碼分析

發(fā)布時間:2023-03-25 17:38:52 來源:億速云 閱讀:102 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹了ElasticSearch節(jié)點、分片、CRUD、倒排索引和分詞源碼分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇ElasticSearch節(jié)點、分片、CRUD、倒排索引和分詞源碼分析文章都會有所收獲,下面我們一起來看看吧。

ElasticSearch

ElasticSearch是非常重要的檢索工具,利用分詞、索引(倒排索引)、分詞從眾多檢索工具中脫穎而出。

基本概念:索引、文檔和REST Api

ElasticSearch是面向文檔的,文檔是所有可搜索數(shù)據(jù)的最小單位

  • 日志文件中的日志項

  • 一本電影的具體信息 / 一張唱片的詳細信息

  • Mp3播放器的一首歌 / 一篇PDF文檔中的具體內容

文檔會被序列化成Josn格式,保存在ElasticSearch中

  • Json對象由字段組成

  • 每個字段都有對應的字段類型(字符串/數(shù)值/布爾/日期/二進制/范圍類型)

每個文檔都有一個UniqueID

你可以自己指定ID

或者通過ElasticSearch自動生成

Json文檔

  • 一篇文檔包含了一系列的字段

  • Json文檔,格式靈活,不需要預先定義格式

    • 字段的類型可以指定或通過ElasticSearch自動推算

    • 支持數(shù)組、支持嵌套

文檔的元數(shù)據(jù)

{
    "_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

分布式系統(tǒng)的可用性和擴展性

  • 高可用性

    • 服務可用性 :允許有節(jié)點停止服務

    • 數(shù)據(jù)可用性 :部分節(jié)點丟失,不會丟失數(shù)據(jù)

  • 可擴展性

    • 請求量提升 / 數(shù)據(jù)的不斷增長(將數(shù)據(jù)分布都所有接點上)

分布式特性

  • elasticsearch的分布式架構的好處

    • 存儲的水平擴容

    • 提高系統(tǒng)的可用性,部分節(jié)點停止服務,整個集群的服務不受影響

  • elasticsearch的分布式架構

    • 不同的集群通過不同的名字來區(qū)分,默認名字"elasticsearch"

    • 通過配置文件修改,或者在命令行中-E cluster.name=stark進行設定

    • 一個集群可以有一個或多個節(jié)點

節(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 - 有主分片未能分配

CRUD

1.使用PostMan創(chuàng)建一個名字叫stark的索引

http://127.0.0.1:9200/stark?pretty
// 返回值
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "stark"
}

文檔的CRUD

  • Type名,約定都用_doc

  • Create ,如果ID已經(jīng)存在,會失敗

  • Index ,如果ID不存在,創(chuàng)建新的文檔。否則先刪除現(xiàn)有文檔,再創(chuàng)建新的文檔,版本會增加。

  • Update ,文檔必須已經(jīng)存在,更新只會對相應字段做增量修改。

Create 一個文檔

支持自動生成文檔ID和指定文檔ID兩種方式:

  • 使用POST /indexName/_doc,系統(tǒng)會自動生成Document ID

  • 使用PUT /indexName/_create/ID創(chuàng)建時,URI中顯示指定_create,此時如果該ID的文檔已經(jīng)存在,操作失敗

GET 一個文檔

GET http://127.0.0.1:9200/IndexName/_doc/ID

  • 找到文檔,返回Http 200

    • 文檔元信息,同一個ID的文檔,即使被刪除,Version號也會不斷增加

    • _source 中默認包含了文檔的所有原始信息

  • 找不到文檔,返回Http 404

Index 文檔

PUT IndexName/_doc/1
{
    "tags":["name","age","sex"]
}

Index和Create不一樣的地方:如果文檔存在,就索引新的文檔。否則現(xiàn)有文檔會被刪除,新的文檔被索引,版本信息(Version) + 1。

Update 文檔

Update方法不會刪除原來的文檔,而是實現(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調用中,對不同的索引進行操作,支持四種類型操作,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 與 Analyzer

  • Analysis,文本分析是把全文本轉換成一系列單詞(term / token)的過程,也叫分詞。

  • Analysis 是通過 Analyzer 來實現(xiàn)的,可使用elasticsearch內置的分析器 / 或者按需定制化分析器。

  • 除了在數(shù)據(jù)寫入時轉換詞條,匹配Query語句時候也需要用相同的分析器對查詢進行查詢語句進行分析。

Analyzer的組成

  • 分詞器是專門處理分詞的組件,Analyzer由三部分組成:

    • ① 針對原始文本處理,例如去除html

    • ② 按照規(guī)則切分單詞

    • ③ 將切分的單詞進行加工,小寫,刪除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開頭的索引

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:文檔原始信息

URI Search詳解

指定字段查詢 Vs 泛查詢

q是關鍵字,df是指定字段,泛查詢就是查詢所有字段中包含關鍵字的結果

//指定字段
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查詢,還要求前后順序保持一致

分組和引號

  • 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è)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI