欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

搜索一文入門ElasticSearch(節(jié)點(diǎn) 分片 CRUD 倒排索引 分詞)

 更新時(shí)間:2023年03月23日 14:58:32   作者:stark張宇  
這篇文章主要為大家介紹了搜索一文入門ElasticSearch(節(jié)點(diǎn) 分片 CRUD 倒排索引 分詞)的基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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)高亮顯示

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)
  • 分組
      • 表示 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)文章

  • Mybatis 將table表名作為參數(shù)傳入操作

    Mybatis 將table表名作為參數(shù)傳入操作

    這篇文章主要介紹了Mybatis 將table表名作為參數(shù)傳入操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java中常用時(shí)間的一些相關(guān)方法

    Java中常用時(shí)間的一些相關(guān)方法

    日期的使用多種多樣,但萬(wàn)變不離其宗,下面這篇文章主要給大家介紹了關(guān)于Java中常用時(shí)間的一些相關(guān)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • java如何將int數(shù)組轉(zhuǎn)化為Integer數(shù)組

    java如何將int數(shù)組轉(zhuǎn)化為Integer數(shù)組

    這篇文章主要介紹了java如何將int數(shù)組轉(zhuǎn)化為Integer數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳細(xì)談?wù)凷pring事務(wù)是如何管理的

    詳細(xì)談?wù)凷pring事務(wù)是如何管理的

    在使用傳統(tǒng)的事務(wù)編程策略時(shí),程序代碼必然和具體的事務(wù)操作代碼耦合,而使用Spring事務(wù)管理策略恰好可以避免這種尷尬,Spring的事務(wù)管理提供了兩種方式:編程式事務(wù)管理和聲明式事務(wù)管理,這篇文章主要給大家介紹了關(guān)于Spring事務(wù)是如何管理的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Java中如何獲取當(dāng)前服務(wù)器的IP地址

    Java中如何獲取當(dāng)前服務(wù)器的IP地址

    這篇文章主要給大家介紹了關(guān)于Java中如何獲取當(dāng)前服務(wù)器的IP地址的相關(guān)資料,我們可以使用Java中的InetAddress類來(lái)獲取Linux服務(wù)器的IP地址,需要的朋友可以參考下
    2023-07-07
  • 詳解Java中如何定義和訪問(wèn)靜態(tài)字段和方法

    詳解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)類

    一文帶你熟練掌握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-05
  • Java基礎(chǔ)之簡(jiǎn)單的圖片處理

    Java基礎(chǔ)之簡(jiǎn)單的圖片處理

    這篇文章主要介紹了Java基礎(chǔ)之簡(jiǎn)單的圖片處理,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SSH框架網(wǎng)上商城項(xiàng)目第3戰(zhàn)之使用EasyUI搭建后臺(tái)頁(yè)面框架

    SSH框架網(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-05
  • JAVA基于數(shù)組實(shí)現(xiàn)的商品信息查詢功能示例

    JAVA基于數(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

最新評(píng)論