色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

傳統關系型數據庫和ES的差別

Android編程精選 ? 來源:掘金 ? 作者:Richard_Yi ? 2021-10-12 10:49 ? 次閱讀

https://juejin.cn/post/6889020742366920712

本文不會關注 ES 里面的分布式技術、相關 API 的使用,而是專注分享下“ES 如何快速檢索”這個主題上面。這個也是我在學習之前對 ES 最感興趣的部分。

本文大致包括以下內容:

關于搜索:傳統關系型數據庫和 ES 的差別

索引擎原理

細究倒排索引:

倒排索引具體是個什么樣子的(posting list→term dic→term index)

關于 postings list 的一些巧技(FOR、Roaring Bitmaps)

如何快速做聯合查詢?

關于搜索

先設想一個關于搜索的場景,假設我們要搜索一首詩句內容中帶“前”字的古詩。

用傳統關系型數據庫和 ES 實現會有什么差別?如果用像 MySQL 這樣的 RDBMS 來存儲古詩的話,我們應該會去使用這樣的 SQL 去查詢:

select name from poems where content like “%前%”;

這種我們稱為順序掃描法,需要遍歷所有的記錄進行匹配。不但效率低,而且不符合我們搜索時的期望。

比如我們在搜索“ABCD“這樣的關鍵詞時,通常還希望看到”A“,”AB“,”CD“,“ABC”的搜索結果。于是乎就有了專業的搜索引擎,比如我們今天的主角 ES。

搜索引擎原理

搜索引擎的搜索原理簡單概括的話可以分為這么幾步:

內容爬取,停頓詞過濾,比如一些無用的像”的“,“了”之類的語氣詞/連接詞

內容分詞,提取關鍵詞

根據關鍵詞建立倒排索引

用戶輸入關鍵詞進行搜索

這里我們就引出了一個概念,也是我們今天的要剖析的重點倒排索引。也是 ES 的核心知識點。

如果你了解 ES 應該知道,ES 可以說是對 Lucene 的一個封裝,里面關于倒排索引的實現就是通過 lucene 這個 jar 包提供的 API 實現的,所以下面講的關于倒排索引的內容實際上都是 lucene 里面的內容。

倒排索引

首先我們還不能忘了我們之前提的搜索需求,先看下建立倒排索引之后,我們上述的查詢需求會變成什么樣子。

這樣我們一輸入“前”,借助倒排索引就可以直接定位到符合查詢條件的古詩。

當然這只是一個很大白話的形式來描述倒排索引的簡要工作原理。在 ES 中,這個倒排索引是具體是個什么樣的,怎么存儲的等等,這些才是倒排索引的精華內容。

①幾個概念

在進入下文之前,先描述幾個前置概念。

term:關鍵詞這個東西是我自己的講法,在 ES 中,關鍵詞被稱為 term。

postings list:還是用上面的例子,{靜夜思,望廬山瀑布}是 ”前“ 這個 term 所對應列表。在 ES 中,這些被描述為所有包含特定 term 文檔的 id 的集合。

由于整型數字 integer 可以被高效壓縮的特質,integer 是最適合放在 postings list 作為文檔的唯一標識的,ES 會對這些存入的文檔進行處理,轉化成一個唯一的整型 id。

再說下這個 id 的范圍,在存儲數據的時候,在每一個 shard 里面,ES 會將數據存入不同的 segment,這是一個比 shard 更小的分片單位,這些 segment 會定期合并。

在每一個 segment 里面都會保存最多 2^31 個文檔,每個文檔被分配一個唯一的 id,從 0 到 (2^31)-1。相關的名詞都是 ES 官方文檔給的描述,后面參考材料中都可以找到出處。

②索引內部結構

上面所描述的倒排索引,僅僅是一個很粗糙的模型。真的要在實際生產中使用,當然還差的很遠。

在實際生產場景中,比如 ES 最常用的日志分析,日志內容進行分詞之后,可以得到多少的 term?

那么如何快速的在海量 term 中查詢到對應的 term 呢?遍歷一遍顯然是不現實的。

term dictionary:于是乎就有了 term dictionary,ES 為了能快速查找到 term,將所有的 term 排了一個序,二分法查找。

是不是感覺有點眼熟,這不就是 MySQL 的索引方式的,直接用 B+樹建立索引詞典指向被索引的數據。

term index:但是問題又來了,你覺得 Term Dictionary 應該放在哪里?肯定是放在內存里面吧?磁盤 io 那么慢。就像 MySQL 索引就是存在內存里面了。

但是如果把整個 term dictionary 放在內存里面會有什么后果呢?內存爆了。..

別忘了,ES 默認可是會對全部 text 字段進行索引,必然會消耗巨大的內存,為此 ES 針對索引進行了深度的優化。

在保證執行效率的同時,盡量縮減內存空間的占用。于是乎就有了 term index。

Term index:從數據結構上分類算是一個“Trie 樹”,也就是我們常說的字典樹。

這是一種專門處理字符串匹配的數據結構,用來解決在一組字符串集合中快速查找某個字符串的問題。

這棵樹不會包含所有的 term,它包含的是 term 的一些前綴(這也是字典樹的使用場景,公共前綴)。

通過 term index 可以快速地定位到 term dictionary 的某個 offset,然后從這個位置再往后順序查找。就想右邊這個圖所表示的。

怎么樣,像不像我們查英文字典,我們定位 S 開頭的第一個單詞,或者定位到 Sh 開頭的第一個單詞,然后再往后順序查詢?

lucene 在這里還做了兩點優化,一是 term dictionary 在磁盤上面是分 block 保存的,一個 block 內部利用公共前綴壓縮,比如都是 Ab 開頭的單詞就可以把 Ab 省去。

二是 term index 在內存中是以 FST(finite state transducers)的數據結構保存的。

FST 有兩個優點:

空間占用小:通過對詞典中單詞前綴和后綴的重復利用,壓縮了存儲空間。

查詢速度快:O(len(str)) 的查詢時間復雜度。

FST 的理論比較復雜,本文不細講,延伸閱讀:

https://www.shenyanchao.cn/blog/2018/12/04/lucene-fst/

OK,現在我們能得到 lucene 倒排索引大致是個什么樣子的了。

關于 postings list 的一些巧技

在實際使用中,postings list 還需要解決幾個痛點:

postings list 如果不進行壓縮,會非常占用磁盤空間。

聯合查詢下,如何快速求交并集(intersections and unions)。

對于如何壓縮,可能會有人覺得沒有必要,”posting list 不是已經只存儲文檔 id 了嗎?還需要壓縮?”,但是如果在 posting list 有百萬個 doc id 的情況,壓縮就顯得很有必要了。

比如按照朝代查詢古詩,至于為啥需要求交并集,ES 是專門用來搜索的,肯定會有很多聯合查詢的需求吧 (AND、OR)。按照上面的思路,我們先將如何壓縮。

①壓縮

Frame of Reference:在 lucene 中,要求 postings lists 都要是有序的整形數組。

這樣就帶來了一個很好的好處,可以通過 增量編碼(delta-encode)這種方式進行壓縮。

比如現在有 id 列表 [73, 300, 302, 332, 343, 372],轉化成每一個 id 相對于前一個 id 的增量值(第一個 id 的前一個 id 默認是 0,增量就是它自己)列表是 [73, 227, 2, 30, 11, 29]。

在這個新的列表里面,所有的 id 都是小于 255 的,所以每個 id 只需要一個字節存儲。

實際上 ES 會做的更加精細:

它會把所有的文檔分成很多個 block,每個 block 正好包含 256 個文檔,然后單獨對每個文檔進行增量編碼。

計算出存儲這個 block 里面所有文檔最多需要多少位來保存每個 id,并且把這個位數作為頭信息(header)放在每個 block 的前面。這個技術叫 Frame of Reference。

上圖也是來自于 ES 官方博客中的一個示例(假設每個 block 只有 3 個文件而不是 256)。

FOR 的步驟可以總結為:

進過最后的位壓縮之后,整型數組的類型從固定大小(8,16,32,64 位)4 種類型,擴展到了 [1-64] 位共 64 種類型。

通過以上的方式可以極大的節省 posting list 的空間消耗,提高查詢性能。不過 ES 為了提高 filter 過濾器查詢的性能,還做了更多的工作,那就是緩存。

Roaring Bitmaps (for filter cache):在 ES 中,可以使用 filters 來優化查詢,filter 查詢只處理文檔是否匹配與否,不涉及文檔評分操作,查詢的結果可以被緩存。

對于 filter 查詢,es 提供了 filter cache 這種特殊的緩存,filter cache 用來存儲 filters 得到的結果集。

緩存 filters 不需要太多的內存,它只保留一種信息,即哪些文檔與 filter 相匹配。同時它可以由其它的查詢復用,極大地提升了查詢的性能。

我們上面提到的 Frame Of Reference 壓縮算法對于 postings list 來說效果很好,但對于需要存儲在內存中的 filter cache 等不太合適。

filter cache 會存儲那些經常使用的數據,針對 filter 的緩存就是為了加速處理效率,對壓縮算法要求更高。

對于這類 postings list,ES 采用不一樣的壓縮方式。那么讓我們一步步來。首先我們知道 postings list 是 Integer 數組,具有壓縮空間。

假設有這么一個數組,我們第一個壓縮的思路是什么?用位的方式來表示,每個文檔對應其中的一位,也就是我們常說的位圖,bitmap。

它經常被作為索引用在數據庫、查詢引擎和搜索引擎中,并且位操作(如 and 求交集、or 求并集)之間可以并行,效率更好。

但是,位圖有個很明顯的缺點,不管業務中實際的元素基數有多少,它占用的內存空間都恒定不變。

也就是說不適用于稀疏存儲。業內對于稀疏位圖也有很多成熟的壓縮方案,lucene 采用的就是 roaring bitmaps。

我這里用簡單的方式描述一下這個壓縮過程是怎么樣:

將 doc id 拆成高 16 位,低 16 位。對高位進行聚合 (以高位做 key,value 為有相同高位的所有低位數組),根據低位的數據量 (不同高位聚合出的低位數組長度不相同),使用不同的 container(數據結構) 存儲。

len《4096 ArrayContainer 直接存值

len》=4096 BitmapContainer 使用 bitmap 存儲

分界線的來源:value 的最大總數是為2^16=65536. 假設以 bitmap 方式存儲需要 65536bit=8kb,而直接存值的方式,一個值 2 byte,4K 個總共需要2byte*4K=8kb。

所以當 value 總量 《4k 時,使用直接存值的方式更節省空間。

空間壓縮主要體現在:

高位聚合(假設數據中有 100w 個高位相同的值,原先需要 100w2byte,現在只要 12byte)

低位壓縮

缺點就在于位操作的速度相對于原生的 bitmap 會有影響。這就是 trade-off 呀。平衡的藝術。

②聯合查詢

講完了壓縮,我們再來講講聯合查詢。先講簡單的,如果查詢有 filter cache,那就是直接拿 filter cache 來做計算,也就是說位圖來做 AND 或者 OR 的計算。

如果查詢的 filter 沒有緩存,那么就用 skip list 的方式去遍歷磁盤上的 postings list。

以上是三個 posting list。我們現在需要把它們用 AND 的關系合并,得出 posting list 的交集。

首先選擇最短的 posting list,逐個在另外兩個 posting list 中查找看是否存在,最后得到交集的結果。

遍歷的過程可以跳過一些元素,比如我們遍歷到綠色的 13 的時候,就可以跳過藍色的 3 了,因為 3 比 13 要小。

用 skip list 還會帶來一個好處,還記得前面說的嗎,postings list 在磁盤里面是采用 FOR 的編碼方式存儲的。

會把所有的文檔分成很多個 block,每個 block 正好包含 256 個文檔,然后單獨對每個文檔進行增量編碼,計算出存儲這個 block 里面所有文檔最多需要多少位來保存每個 id,并且把這個位數作為頭信息(header)放在每個 block 的前面。

因為這個 FOR 的編碼是有解壓縮成本的。利用 skip list,除了跳過了遍歷的成本,也跳過了解壓縮這些壓縮過的 block 的過程,從而節省了 cpu

總結

下面我們來做一個技術總結:

①為了能夠快速定位到目標文檔,ES 使用倒排索引技術來優化搜索速度,雖然空間消耗比較大,但是搜索性能提高十分顯著。

②為了能夠在數量巨大的 terms 中快速定位到某一個 term,同時節約對內存的使用和減少磁盤 io 的讀取。

lucene 使用 ”term index→term dictionary→postings list“ 的倒排索引結構,通過 FST 壓縮放入內存,進一步提高搜索效率。

③為了減少 postings list 的磁盤消耗,lucene 使用了 FOR(Frame of Reference)技術壓縮,帶來的壓縮效果十分明顯。

④ES 的 filter 語句采用了 Roaring Bitmap 技術來緩存搜索結果,保證高頻 filter 查詢速度的同時降低存儲空間消耗。

⑤在聯合查詢時,在有 filter cache 的情況下,會直接利用位圖的原生特性快速求交并集得到聯合查詢結果,否則使用 skip list 對多個 postings list 求交并集,跳過遍歷成本并且節省部分數據的解壓縮 cpu 成本。

Elasticsearch 的索引思路

將磁盤里的東西盡量搬進內存,減少磁盤隨機讀取次數 (同時也利用磁盤順序讀特性),結合各種壓縮算法,用及其苛刻的態度使用內存。

所以,對于使用 Elasticsearch 進行索引時需要注意:

不需要索引的字段,一定要明確定義出來,因為默認是自動建索引的。

同樣的道理,對于 String 類型的字段,不需要 analysis 的也需要明確定義出來,因為默認也是會 analysis 的。

選擇有規律的 ID 很重要,隨機性太大的 ID(比如 Java 的 UUID) 不利于查詢。

最后說一下,技術選型永遠伴隨著業務場景的考量,每種數據庫都有自己要解決的問題(或者說擅長的領域),對應的就有自己的數據結構,而不同的使用場景和數據結構,需要用不同的索引,才能起到最大化加快查詢的目的。

這篇文章講的雖是 Lucene 如何實現倒排索引,如何精打細算每一塊內存、磁盤空間、如何用詭譎的位運算加快處理速度。

但往高處思考,再類比一下 MySQL,你就會發現,雖然都是索引,但是實現起來,截然不同。籠統的來說,B-tree 索引是為寫入優化的索引結構。

當我們不需要支持快速的更新的時候,可以用預先排序等方式換取更小的存儲空間,更快的檢索速度等好處,其代價就是更新慢,就像 ES。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • API
    API
    +關注

    關注

    2

    文章

    1499

    瀏覽量

    61965
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64362

原文標題:別再說你不會ElasticSearch,都給你整理好了

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數據庫數據恢復—Mysql數據庫表記錄丟失的數據恢復流程

    Mysql數據庫故障: Mysql數據庫表記錄丟失。 Mysql數據庫故障表現: 1、Mysql數據庫表中無任何數據或只有部分
    的頭像 發表于 12-16 11:05 ?107次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—Mysql<b class='flag-5'>數據庫</b>表記錄丟失的<b class='flag-5'>數據</b>恢復流程

    數據庫數據恢復—MYSQL數據庫ibdata1文件損壞的數據恢復案例

    mysql數據庫故障: mysql數據庫文件ibdata1、MYI、MYD損壞。 故障表現:1、數據庫無法進行查詢等操作;2、使用mysqlcheck和myisamchk無法修復數據庫
    的頭像 發表于 12-09 11:05 ?132次閱讀

    多維表格數據庫Teable的適用場景?

    Teable多維表格數據庫是一款功能強大的云端數據庫和協作工具,結合了電子表格的靈活性和數據庫的強大功能,適用企業內部項目管理 數據收集與整理 內容管理與創意協作 客戶
    的頭像 發表于 10-31 15:48 ?183次閱讀

    數據庫數據恢復—通過拼接數據庫碎片恢復SQLserver數據庫

    一個運行在存儲上的SQLServer數據庫,有1000多個文件,大小幾十TB。數據庫每10天生成一個NDF文件,每個NDF幾百GB大小。數據庫包含兩個LDF文件。 存儲損壞,數據庫
    的頭像 發表于 10-31 13:21 ?199次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—通過拼接<b class='flag-5'>數據庫</b>碎片恢復SQLserver<b class='flag-5'>數據庫</b>

    數據庫可以租用嗎?完整租用流程來了

    數據庫是可以租用的,這是一種合法且便捷的數據存儲和管理方式。云數據庫是云服務提供商提供的各種服務化的關系
    的頭像 發表于 10-28 09:54 ?160次閱讀

    數據庫數據恢復—SQL Server數據庫出現823錯誤的數據恢復案例

    SQL Server數據庫故障: SQL Server附加數據庫出現錯誤823,附加數據庫失敗。數據庫沒有備份,無法通過備份恢復數據庫
    的頭像 發表于 09-20 11:46 ?338次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—SQL Server<b class='flag-5'>數據庫</b>出現823錯誤的<b class='flag-5'>數據</b>恢復案例

    恒訊科技分析:云數據庫rds和redis區別是什么如何選擇?

    數據庫RDS(Relational Database Service)和Redis是兩種不同類型的數據庫服務,它們有各自的特點和適用場景: 1、數據模型:RDS是一種關系
    的頭像 發表于 08-19 15:31 ?378次閱讀

    恒訊科技分析:跨境電商網站有哪些數據庫系統是推薦使用的?

    對于跨境電商網站,數據庫系統的選擇非常關鍵,以下是一些推薦使用的數據庫系統: 1、MySQL:MySQL是一個流行的開源關系數據庫管理系統
    的頭像 發表于 08-12 15:01 ?333次閱讀

    數字化時代的數據管理:多樣化數據庫選型指南

    挑戰。數據庫作為數據管理的核心技術,其選型對于系統至關重要。傳統關系數據庫(RDBMS)以其
    的頭像 發表于 07-08 19:10 ?278次閱讀
    數字化時代的<b class='flag-5'>數據</b>管理:多樣化<b class='flag-5'>數據庫</b>選型指南

    鴻蒙開發接口數據管理:【@ohos.data.rdb (關系數據庫)】

    關系數據庫(Relational Database,RDB)是一種基于關系模型來管理數據數據庫
    的頭像 發表于 06-10 18:35 ?1301次閱讀

    HarmonyOS開發案例:【搭建關系數據庫】(4)

    本節將介紹如何調用關系數據庫接口在本地搭建數據庫,并讀寫相應的用戶數據
    的頭像 發表于 05-11 10:27 ?870次閱讀
    HarmonyOS開發案例:【搭建<b class='flag-5'>關系</b><b class='flag-5'>型</b><b class='flag-5'>數據庫</b>】(4)

    HarmonyOS開發案例:【關系數據庫

    使用關系數據庫的相關接口實現了對賬單的增、刪、改、查操作。
    的頭像 發表于 04-22 14:58 ?648次閱讀
    HarmonyOS開發案例:【<b class='flag-5'>關系</b><b class='flag-5'>型</b><b class='flag-5'>數據庫</b>】

    鴻蒙HarmonyOS開發實例:【分布式關系數據庫

    使用[@ohos.data.relationalStore]接口和[@ohos.distributedDeviceManager]?接口展示了在eTS中分布式關系數據庫的使用,在增、刪、改、查的基本操作外,還包括分布式
    的頭像 發表于 04-11 09:52 ?921次閱讀
    鴻蒙HarmonyOS開發實例:【分布式<b class='flag-5'>關系</b><b class='flag-5'>型</b><b class='flag-5'>數據庫</b>】

    數據庫數據恢復】Oracle數據庫ASM實例無法掛載的數據恢復案例

    oracle數據庫ASM磁盤組掉線,ASM實例不能掛載。數據庫管理員嘗試修復數據庫,但是沒有成功。
    的頭像 發表于 02-01 17:39 ?519次閱讀
    【<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復】Oracle<b class='flag-5'>數據庫</b>ASM實例無法掛載的<b class='flag-5'>數據</b>恢復案例

    深耕文檔數據庫12載,SequoiaDB再開源

    1月15日,巨杉數據庫舉行SequoiaDB新特性及開源項目發布活動。本次活動回顧了巨杉數據庫深耕JSON文檔數據庫12年的發展歷程與技術演進,全面解讀了SequoiaDB包括在高可
    的頭像 發表于 01-16 13:06 ?289次閱讀
    主站蜘蛛池模板: 久久成人午夜电影mp4| 欧美亚洲日韩自拍高清中文| 色丁香婷婷综合缴情综| 这里只有精品网| 国产精品久久久久久影院| 嗯啊不要老师| 一个人的视频全免费在线观看www| 放射源分类办法| 名女躁b久久天天躁| 天天躁日日躁狠狠躁中文字幕老牛 | 748亚洲大胆国模人体| 国产真实乱对白精彩| 色cccwww| japanese色系free日本| 牢记永久免费网址| 亚洲欧美一区二区三区九九九| 国产 亚洲 中文在线 字幕| 暖暖视频免费高清在线观看 视频| 影音先锋av男人资源| 国产综合欧美区在线| 无码AV精品一区二区三区| 成人18视频在线观看| 欧美日韩看看2015永久免费| 中字幕视频在线永久在线观看免费| 精品国产90后在线观看| 新金梅瓶玉蒲团性奴3| 高中生高潮抽搐喷出白浆视频| 欧美特级特黄a大片免费| 97亚洲狠狠色综合久久久久| 久久亚洲精品AV成人无码| 午夜一级毛片看看| 国产精品99久久久久久动态图| 日本老师xxxxx18| www.av日韩| 欧美末成年videos在线| 99RE久久精品国产| 免费看毛片网| 99久久免费国产精品特黄| 年轻的朋友4在线看中文字幕| 51精品少妇人妻AV一区二区| 老头狠狠挺进小莹体内视频|