真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu)

這篇文章主要介紹“如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu)”,在日常操作中,相信很多人在如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

目前成都創(chuàng)新互聯(lián)公司已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、如東網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1、數(shù)據(jù)存儲(chǔ)認(rèn)知前提

正如 Elastic 官方文檔所說:

Elasticsearch 特點(diǎn)之一是:分布式文檔存儲(chǔ)。

Elasticsearch不會(huì)將信息存儲(chǔ)為類似列數(shù)據(jù)庫的行(row),而是存儲(chǔ)為已序列化為JSON文檔的復(fù)雜數(shù)據(jù)結(jié)構(gòu)。

當(dāng)集群中有多個(gè)Elasticsearch節(jié)點(diǎn)時(shí),存儲(chǔ)的文檔會(huì)分布在整個(gè)集群中,并且可以從任何節(jié)點(diǎn)立即訪問。

存儲(chǔ)文檔后,將在1秒鐘內(nèi)(默認(rèn)刷新頻率為1s)幾乎實(shí)時(shí)地對其進(jìn)行索引和完全搜索。

如何做到快速索引和全文檢索的呢? 

Elasticsearch使用倒排索引的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)支持非常快速的全文本搜索。

倒排索引列出了出現(xiàn)在任何文檔中的每個(gè)唯一單詞,并標(biāo)識了每個(gè)單詞出現(xiàn)的所有文檔。

索引可以認(rèn)為是文檔的優(yōu)化集合,每個(gè)文檔都是字段的集合,這些字段是包含數(shù)據(jù)的鍵值對。

如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu)

默認(rèn)情況下,Elasticsearch 對每個(gè)字段中的所有數(shù)據(jù)建立索引,并且每個(gè)索引字段都具有專用的優(yōu)化數(shù)據(jù)結(jié)構(gòu)。

例如,文本字段存儲(chǔ)在倒排索引中,數(shù)字字段和地理字段存儲(chǔ)在BKD樹中。

數(shù)據(jù)類型數(shù)據(jù)結(jié)構(gòu)
text/keyword倒排索引
數(shù)字/地理位置BKD樹

不同字段具有屬于自己字段類型的特定優(yōu)化數(shù)據(jù)結(jié)構(gòu),并具備快速響應(yīng)返回搜索結(jié)果的能力使得 Elasticsearch 搜索飛快! 

1、Inverted Index 倒排索引

1.1 倒排索引定義

面對海量內(nèi)容,如何快速的找到包含用戶查詢詞的內(nèi)容,倒排索引扮演了關(guān)鍵角色。

倒排索引是單詞到文檔映射關(guān)系的最佳實(shí)現(xiàn)形式。

下圖是:書的末頁的索引結(jié)構(gòu),展示了核心關(guān)鍵詞與書頁碼的對應(yīng)關(guān)系。

如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu)

試想一下,沒有這個(gè)索引頁,根據(jù)關(guān)鍵詞從全書查找有多慢,就能直觀體會(huì)出索引的妙處!

1.2 倒排索引示例

拿官方文檔的示例:

假設(shè)我們有兩個(gè)文檔,每個(gè)文檔的 content 域包含如下內(nèi)容:

- 1、The quick brown fox jumped over the lazy dog
- 2、Quick brown foxes leap over lazy dogs in summer
 

對索引編制索引會(huì)受到標(biāo)記化和標(biāo)準(zhǔn)化的處理analysis。

數(shù)據(jù)索引化制約因素:分詞器 analyzer 的選型。

倒排索引(基于 默認(rèn)Standard 標(biāo)準(zhǔn)分詞器分詞)如下所示:

TermDoc_1Doc_2
Quick
X
TheX
brownXX
dogX
dogs
X
foxX
foxes
X
in
X
jumpedX
lazyXX
leap
X
overXX
quickX
summer
X
theX

如上所示,對于文檔中的每個(gè)詞,都包含了其所在文檔的列表。 

1.3 倒排索引特點(diǎn)

  • 在索引時(shí)創(chuàng)建
  • 序列化到磁盤
  • 全文搜索非???/section>
  • 不適合做排序
  • 默認(rèn)開啟 

1.4 倒排索引適用場景

  • 查詢
  • 全文檢索 

2、Doc Values 正排索引 

2.1 Doc Values 定義

在 Elasticsearch 中,Doc Values 就是一種列式存儲(chǔ)結(jié)構(gòu),默認(rèn)情況下每個(gè)字段的 Doc Values 都是激活的(除了 text 類型),Doc Values 是在索引時(shí)創(chuàng)建的,當(dāng)字段索引時(shí),Elasticsearch 為了能夠快速檢索,會(huì)把字段的值加入倒排索引中,同時(shí)它也會(huì)存儲(chǔ)該字段的 Doc Values。

區(qū)別于倒排索引的定義,Doc Values 被定義為:“正排索引”。

如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu) 

2.2 Doc Values 示例

仍然 以 1.2 文檔為例,Doc Values 結(jié)構(gòu)如下所示(僅做舉例):

DocTerms
Doc_1brown, dog, fox, jumped, lazy, over, quick, the
Doc_2brown, dogs, foxes, in, lazy, leap, over, quick, summer

Doc values 通過轉(zhuǎn)置兩者間的關(guān)系來解決適用倒排索引聚合效率低、難以擴(kuò)展的問題。

對比可以看出:倒排索引將詞項(xiàng)映射到包含它們的文檔,doc values 將文檔映射到它們包含的詞項(xiàng)。

 

2.3 Doc Values 特點(diǎn)

  • 在索引時(shí)創(chuàng)建
  • 序列化到磁盤
  • 適合排序操作
  • 將單個(gè)字段的所有值一起存儲(chǔ)在單個(gè)數(shù)據(jù)列中
  • 默認(rèn)情況下,除text之外的所有字段類型均啟用 Doc Values。       

2.4 Doc Values 適用場景

Elasticsearch 中的 Doc Values 常被應(yīng)用到以下場景:

  • 對一個(gè)字段進(jìn)行排序
  • 對一個(gè)字段進(jìn)行聚合
  • 某些過濾,比如地理位置過濾
  • 某些與字段相關(guān)的腳本計(jì)算

注意:

因?yàn)槲臋n值被序列化到磁盤,我們可以依靠操作系統(tǒng)的幫助來快速訪問。

  • 當(dāng) 工作集(working set) 遠(yuǎn)小于節(jié)點(diǎn)的可用內(nèi)存,系統(tǒng)會(huì)自動(dòng)將所有的文檔值保存在內(nèi)存中,使得其讀寫十分高速;

  • 當(dāng)其遠(yuǎn)大于可用內(nèi)存,操作系統(tǒng)會(huì)自動(dòng)把 Doc Values 加載到系統(tǒng)的頁緩存中,從而避免了 jvm 堆內(nèi)存溢出異常。 

2. 5 Doc Values 使用注意事項(xiàng)

對于不需要:排序、聚合、腳本計(jì)算、地理位置過濾的業(yè)務(wù)場景,可以考慮禁用:Doc Values,以節(jié)約存儲(chǔ)。

PUT my_index
{
  "mappings": {
      "properties": {
        "title": {
          "type": "keyword",
          "doc_values": false 
        }
    }
  }
}
   

3、fielddata 

3.1 fielddata 定義

如前第1、2小結(jié)所述:

  • 搜索需要回答“哪個(gè)文檔包含此詞?”的問題。借助:倒排索引實(shí)現(xiàn)。
  • 排序和匯總則需要回答一個(gè)不同的問題:“此字段對本文檔的價(jià)值是什么?” 。借助:正排索引實(shí)現(xiàn)。

text 類型字段是不支持 Doc Values正排索引的,text字段使用是:查詢時(shí)創(chuàng)建的基于的內(nèi)存數(shù)據(jù)結(jié)構(gòu)(query-time in-memory data structure) fielddata。

fielddata 將 text 字段用于聚合、排序或在腳本中使用時(shí),將按需構(gòu)建此數(shù)據(jù)結(jié)構(gòu)。

實(shí)現(xiàn)機(jī)理:它是通過從磁盤讀取每個(gè)段的整個(gè)反向索引,反轉(zhuǎn)詞項(xiàng)??文檔關(guān)系并將結(jié)果存儲(chǔ)在JVM堆中的內(nèi)存中來構(gòu)建的。 

3.2 fielddata 示例

嚴(yán)格意義講,2.2 的示例,放到這里會(huì)更合適。

DELETE test_001
PUT test_001
{
  "mappings": {
    "properties": {
      "body":{
        "type":"text",
        "analyzer": "standard",
        "fielddata": true
      }
    }
  }
}

POST test_001/_bulk
{"index":{"_id":1}}
{"body":"The quick brown fox jumped over the lazy dog"}
{"index":{"_id":2}}
{"body":"Quick brown foxes leap over lazy dogs in summer"}

GET test_001/_search
{
  "size": 0,
  "query": {
    "match": {
      "body": "brown"
    }
  },
  "aggs": {
    "popular_terms": {
      "terms": {
        "field": "body"
      }
    }
  }
}
   

3.3 fielddata 特點(diǎn)

  • 適用于文檔之類的操作
  • 但僅適用于 text 文本字段類型
  • 在查詢時(shí)創(chuàng)建
  • 內(nèi)存中數(shù)據(jù)結(jié)構(gòu)
  • 沒有序列化到磁盤
  • 默認(rèn)情況下被禁用(構(gòu)建它們很昂貴,并且在堆中預(yù)置)

3.4 fielddata 適用場景

  • 全文統(tǒng)計(jì)詞頻
  • 全文生成詞云
  • text類型:聚合、排序、腳本計(jì)算
 

3.5 fielddata 使用注意事項(xiàng)

  • 在啟用字段數(shù)據(jù)之前,請考慮為什么將文本字段用于聚合、排序或在腳本中使用。
  • 啟用 fielddata 通常沒有任何意義,因?yàn)樗浅:馁M(fèi)內(nèi)存資源。
  • 僅僅是做全文搜索的應(yīng)用,就不需要啟用fielddata。 

4、_source 字段解讀 

4.1 _source 定義

_source 字段包含在索引時(shí)間傳遞的原始JSON文檔主體。

_source 字段本身未構(gòu)建索引(因此不可搜索),但已存儲(chǔ)該字段,以便在執(zhí)行獲取請求(如get或search)時(shí)可以將其返回。

 

4.2 _source 使用注意事項(xiàng)

第一:盡管非常方便,但是source字段確實(shí)會(huì)導(dǎo)致索引內(nèi)的存儲(chǔ)開銷。因此,可以將其禁用。

PUT my-index-000001
{
  "mappings": {
    "_source": {
      "enabled": false
    }
  }
}
 

第二:禁用前要做好以下衡量 禁用 _source 后,如下操作將不可用:

  1. update, update_by_query 和 reindex API

  2. 高亮操作

所以,要在存儲(chǔ)空間、業(yè)務(wù)場景之間權(quán)衡利弊后選型。

5、store 字段解讀 

5.1 store 定義

默認(rèn)情況下,對字段值進(jìn)行索引以使其可搜索(第1節(jié)的 倒排索引),但不存儲(chǔ)它們。

這意味著可以查詢該字段,但是無法檢索原始字段值。

通常這無關(guān)緊要。該字段值已經(jīng)是_source字段的一部分,默認(rèn)情況下已存儲(chǔ)。

但,某些特殊場景下,如果你只想檢索單個(gè)字段或幾個(gè)字段的值,而不是整個(gè)_source的值,則可以使用源過濾來實(shí)現(xiàn)。

這個(gè)時(shí)候, store 就派上用場了。 

5.2 store 示例

DELETE news-000001
PUT news-000001
{
  "mappings": {
    "_source": {
      "enabled": false
    },
    "properties": {
      "title": {
        "type": "text",
        "store": true
      },
      "date": {
        "type": "date",
        "store": true
      },
      "content": {
        "type": "text"
      }
    }
  }
}

PUT news-000001/_doc/1
{
  "title":   "Some short title",
  "date":    "2021-01-01",
  "content": "A very long content field..."
}

GET news-000001/_search

GET news-000001/_search
{
  "stored_fields": [ "title", "date" ] 
}
   

5.3 store 適用場景

如 5.2 示例,在某些情況下,存儲(chǔ)字段可能很有意義。例如,采集的新聞數(shù)據(jù)是:帶有標(biāo)題、日期和很大內(nèi)容字段的文檔,

則可能只想檢索標(biāo)題和日期,而不必從較大的_source字段中提取這些字段。 

到此,關(guān)于“如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


本文名稱:如何理解Elasticsearch的內(nèi)部數(shù)據(jù)結(jié)構(gòu)
網(wǎng)站URL:http://weahome.cn/article/psisei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部