国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

為什么 ElasticSearch 比 MySQL 更適合復雜條件搜索

數據庫 MySQL
Elasticsearch 是開源的實時分布式搜索分析引擎,內部使用 Lucene 做索引與搜索。它提供"準實時搜索"能力,并且能動態集群規模,彈性擴容。

 [[382143]]

本文轉載自微信公眾號「程序員歷小冰」,作者歷小冰。轉載本文請聯系程序員歷小冰公眾號。

熟悉 MySQL 的同學一定都知道,MySQL 對于復雜條件查詢的支持并不好。MySQL 最多使用一個條件涉及的索引來過濾,然后剩余的條件只能在遍歷行過程中進行內存過濾,對這個過程不了解的同學可以先行閱讀一下《MySQL復雜where條件分析》。

上述這種處理復雜條件查詢的方式因為只能通過一個索引進行過濾,所以需要進行大量的 I/O 操作來讀取行數據,并消耗 CPU 進行內存過濾,導致查詢性能的下降。

而 ElasticSearch 因其特性,十分適合進行復雜條件查詢,是業界主流的復雜條件查詢場景解決方案,廣泛應用于訂單和日志查詢等場景。

下面我們就一起來看一下,為什么 ElasticSearch 適合進行復雜條件查詢。

ElasticSearch 簡介

Elasticsearch 是開源的實時分布式搜索分析引擎,內部使用 Lucene 做索引與搜索。它提供"準實時搜索"能力,并且能動態集群規模,彈性擴容。

Elasticsearch 使用 Lucene 作為其全文搜索引擎,用于處理純文本的數據,但 Lucene 只是一個庫,提供建立索引、執行搜索等接口,但不包含分布式服務,這些正是 Elasticsearch 做的。

下面,我們來介紹一下 ElasticSearch 的相關概念。為了便于初學者理解,我們先將 ElasticSearch 中的概念和 MySQL 中的概念大致地進行對應。但是二者在具體細節上還是有很多差異的,大家深入了解 ElasticSearch 就會將二者區分清楚,不能強行對比等同。

  • ElasticSearch 中的索引 Index 類似于 MySQL 中的數據庫 Database;
  • ElasticSearch 中的類型 Type 類似于 MySQL 中的表 Table;需要注意,這個概念在 7.x 版本中被完全刪除,而且概念上和 Table 也有較大差異;
  • ElasticSearch 中的文檔 Document 類似于 MySQL 中的數據行 Row,每個文檔由多個字段 Filed 組成,這個Filed 就類似于 MySQL 的 Column;
  • ElasticSearch 中的映射 Mapping 是對索引庫中的索引字段及其數據類型進行定義,類似于關系型數據庫中的表結構 Schema;
  • ElasticSearch 使用自己的領域語言 Query DSL 來進行增刪改查,而 MySQL 使用 SQL 語言進行上訴操作。
  • ElasticSearch 還有一系列有關其分布式特性的概念,我們這里就暫不介紹了,等后續學習到其分布式特性時在進行介紹。

倒排索引

MySQL 有 B+ 樹索引,而 ElasticSearch 則是倒排索引 (Inverted Index),它通過倒排索引來實現比 MySQL 更快的過濾和復雜條件的查詢,此外,全文搜索功能也是依賴倒排索引才能實現。下面,我們就具體來看一下何為倒排索引。

倒排索引按照維基百科的描述,是存儲文檔內容到文檔位置映射關系的數據庫索引結構。不過只看定義,我是有點迷惑,這不是和 MySQL 的非主鍵索引類似嘛,為什么要叫它“倒排”呢?這個問題我目前也為搞清楚,可能要等到后續了解了其具體實現才能理解。

我們還是以書籍檢索為例,假設有以下數據,每一行就是一個 Document,每個 Document 由 id,ISBN 號,作者名稱和評分組成。

給上述數據按照 ISBN 和 Author 建立的倒排索引如下所示。倒排索引是每個字段分開建立的,相互獨立。有兩個專門的術語,分別是索引 Term 和倒排表 Posting List。字段的值就是 Term,比如 N0007,而 Term 對應的文檔 ID 的列表就是 Posting List,對應圖中紅色的部分。

一般 Term 都是按照順序排序的,比如 Author 名稱就是按照字母序進行了排序,排序之后,當我們搜索某一個 Term 時,就不需要從頭遍歷,而是采用二分查找。一系列排序后的 Term 就組成了索引表 Term Dictionary。

但是 Term Dictionary 往往很大,無法完整放入內存,這是為了更快的查詢,還需要再給它創建索引,也就是 Term Index 。

ElasticSearch 使用 Burst-Trie 結構來實現 Term Index,它是一種前綴樹 Trie 的一種變種,它主要是將后綴進行了壓縮,降低了Trie的高度,從而獲取更好查詢性能。

Term Index 并不需要像 MySQL 的索引一樣,包含所有的 Term,而是包含的是這些 Term 的前綴。它就類似于字典的查詢目錄,可以進行快速定位到 Term Dictionary 的某一位置,然后再從這個位置向后查詢。

綜上, Alice,Alf,Arlan,Bob,Tom 等詞的倒排索引如下所示。綠色部分是 Term Index,藍色部分是 Term Dictionary,紅色部分是 Posting List。

一般來說,Term Index 都是全部緩存在內存中,查詢時,先通過其快速定位到 Term Dictionary 對應的大致范圍,然后再進行磁盤讀取查找對應的 Term,這樣就大大減少了磁盤 I/O 的次數。

聯合索引查詢

了解了 ElasticSearch 的倒排索引后,我們再來看看其如何處理復雜的聯合索引查詢。比如上述書籍例子中,我們需要查詢評分等于2.2并且作者名稱叫 Tom的書籍。

理論上,我們只需要分別按照 Score 和 Author 字段的倒排索引進行查詢,獲取響應的 Posting List,再將其做交集合并即可。

這里又要吐槽一下 MySQL,它是不支持這個合并操作的,它只能按照一個字段的索引進行查詢,然后根據另外一個字段的條件做內存過濾。順便說一下,MySQL 的 join 功能也弱爆了,感興趣的同學可以了解一下這篇文章

而 ElasticSearch 則支持使用跳表 Skip List和 Bitset 的方式將數據集進行合并。

  • 使用 Skip List 結構,同時遍歷 Score 和 Author 查詢出來的 Posting List,利用其 Skip List 結構,相互跳躍對比,得出合集。
  • 使用 Bitset 結構,對 Score 和 Author 查詢出來的 Posting List 的值計算出各自的 Bitset,然后進行 AND 操作。

跳表合并策略

ElasticSearch 在存儲 Posting List 數據時,就保存了對應的多級跳表結構響應的數據,這也體現了其空間換時間的基本思想。

這里先介紹一下跳表的基本概念,它其實是一種可以進行二分查找的有序鏈表。跳表在原有的有序鏈表上面增加了多級索引,通過索引來實現快速查找。首先在最高級索引上查找最后一個小于當前查找元素的位置,然后再跳到次高級索引繼續查找,直到跳到最底層為止,通過這種方式,加快了查詢的速度。

比如,按照 Score 查出來的 Posting List 為[2,3,4,5,7,9,10,11],按照 Author 查出來的結果為 [3,8,9,12,13],則二者的跳表結構如下圖所示。

具體合并過程則是先選最短的 posting list,也就是 Author 的結果集,從其最小的一個 id 開始,將其作為當前最大值。然后依次剩余 posting list 中查找大于或等于該值的位置。

比如上述結果集中,先去 Score 結果集中查找 3,找到后,就表明 3是二者的合集元素之一;然后再重新開啟一輪,選取 Author 結果集中 3 的下一個值 8 ,去 Score 結果集查詢 8,發現了大于等于 8 的最小的值是 9 ,所以不可能有共同的值 8,然后再去 Author 結果集查找 9 ,發現其大于等于 9 的最小值是 12,所以再去 Score 結果集中查找大于等于 12的值,發現并不存在;最終得出二者的合集就只有[3]。

在查詢過程中,每個 posting list 都可以根據當前 id 通過 skip list 快速跳過不符合的 id 值,加速整個合并取交集的過程。

ElasticSearch 對于較長的 posting list 也會使用 Frame Of Reference 進行壓縮編碼,減少了磁盤占用,減少了索引尺寸。有關具體存儲結構的實現我們后續再進行細聊。

Bitset 合并策略

ElasticSearch除了使用 skipList 來進行數據磁盤讀取時的合并操作外,還會將一些查詢條件對應的結果集 posting list 進行內存緩存,也就是所謂的 Filter Cache,為了后續再次復用。

為了減少內存緩存所消耗的內存空間大小,ElasticSearch 沒有使用單純的數組和 bitset 來存儲 posting list,而是使用要壓縮效率更高的 Roaring Bitmap。

我們可以先來講一下單純數組或 bitset 數據結構為什么并不使用。比如如下一道較為常見的面試題目:

給定含有40億個不重復的位于[0, 2^32 - 1]區間內的整數的集合,如何快速判定某個數是否在該集合內?

如果我們要使用 unsigned long 數組來存儲它的話,也就需要消耗 40億 * 32 位 = 160 Byte,大致是 16000 MB。

如果要使用位圖 Bitset 來存儲的話,即某個數位于原集合內,就將它對應的位圖內的比特置為1,否則保持為0。這樣只需要消耗 2 ^ 32 位 = 512 MB,這可只有原來的 3.2 % 左右。

但是,Bitset 也有其缺陷,也就是稀疏存儲的問題,比如上述集合并不是 40億,而是只有2,3個,那么 Bitset 中只有少數幾位是1,其他位都是 0,但是它仍然占用了 512 MB。

而 RoaringBitmap 就是為了解決稀疏存儲的問題。下圖就是 RoaringBitmap 的基本原理示意圖。

首先,如上圖所示,計算出32位無符號整數和 65536 的除數和余數。其含義表示,將32位無符號整數按照高16位分桶,即最多可能有2^16=65536個桶,術語懲治為 container。存儲數據時,按照數據的高16位找到 container(找不到就會新建一個),再將低16位放入container中。也就是說,一個 RoaringBitmap 就是很多container的集合。

然后 container 內具體的存儲結構要根據存入其內數據的基數來決定。

  • 基數小于 2 ^ 12 次方即 4096時,使用unsigned short類型的有序數組來存儲,最大消耗空間就是 8 KB。
  • 基數大于 4096 時,則使用大小為 2 ^ 16 次方的普通 bitset 來存儲,固定消耗 8 KB。當然,有些時候也會對 bitset 進行行程長度編碼(RLE)壓縮,進一步減少空間占用。

ElasticSearch 就是使用 Roaring Bitmap 來緩存不同條件查詢出來的 posting list,然后再進行與操作計算出最終結果集。

后記

至此,我們也算了解了 ElasticSearch 為什么比 MySQL 更適合復雜條件查詢,但是有好就有弊,因為為了查詢做了這么多的準備工作,ElasticSearch 的插入速度就會慢于 MySQL,而且數據存入ES后并不是立馬就能檢索到。

 

責任編輯:武曉燕 來源: 程序員歷小冰
相關推薦

2021-04-28 14:50:07

ElasticSearMySQL數據庫

2021-04-21 07:31:01

ElasticSearMySQLCPU

2021-01-15 10:52:10

PythonVBAExcel

2018-10-17 12:34:36

災難恢復云計算數據中心

2024-09-09 04:00:00

GPU人工智能

2010-11-24 10:16:04

Office 365Google Apps

2013-01-29 10:40:26

云環境應用程序開發

2019-08-21 09:24:45

GPUCPU深度學習

2013-01-29 08:43:32

應用程序開發PaaS

2011-12-07 20:43:33

2021-02-22 10:39:10

多云云計算云平臺

2021-03-22 08:29:59

Elasticsear搜索系統

2019-01-31 10:15:14

群聊單聊消息

2025-09-28 01:25:00

2009-11-05 18:50:04

Windows 7上網本

2009-09-04 11:26:00

英特爾虛擬化

2024-04-03 09:23:31

ES索引分析器

2010-07-13 16:15:49

XenServer5.6

2018-03-28 14:24:07

安卓蘋果智能家居

2021-12-13 01:40:29

ElasticSear倒排索引
點贊
收藏

51CTO技術棧公眾號

裸模一区二区三区免费| 国产精品一区二区三区在线观| 中文精品一区二区三区| 精品视频一二三| 成人全视频在线观看在线播放高清 | 国模杨依粉嫩蝴蝶150p| 激情久久免费视频| 成人av电影在线网| 亚洲国产欧美一区| 51国偷自产一区二区三区 | 99亚偷拍自图区亚洲| 欧美二区在线观看| 国产伦精品一区二区三区精品视频| 麻豆电影传媒二区| 日韩影片在线观看| 精品国产精品自拍| 国产一区二区高清不卡 | 成人黄色网免费| 亚洲在线色站| 男人天堂久久久| 中文在线日韩| 狠狠做深爱婷婷久久综合一区| 国产精品成人观看视频国产奇米| 男人的天堂网av| 亚洲欧洲一二区| 久久综合给合久久狠狠狠97色69| 国产亚洲欧美另类中文| 日韩一级特黄毛片| 日韩一级特黄| 99re成人精品视频| 国产一区二区三区丝袜| 日本熟妇人妻中出| 一区二区三区视频免费观看| 国产精品美女久久久久久久久 | 96pao国产成视频永久免费| 欧美大尺度做爰床戏| 日韩在线第七页| 日本高清不卡aⅴ免费网站| 亚洲影视中文字幕| 中文字幕资源网在线观看免费| 亚洲国产第一| 亚洲第一福利视频在线| 狠狠精品干练久久久无码中文字幕| 国产精品久久久久久久久免费高清 | 久久久久久久久丰满| 欧美三级视频在线| 日日摸日日碰夜夜爽av| 日本不卡电影| 精品电影一区二区| 国产精品va在线观看无码| 欧美一区国产| 亚洲乱码国产乱码精品精可以看| 国产在线播放一区二区| 久久久久观看| 亚洲成在人线av| 亚洲а∨精品天堂在线| 成人免费观看男女羞羞视频| 懂色中文一区二区三区在线视频| 久久久精品区| 精品久久国产字幕高潮| 在线免费视频你懂得| 国产清纯美女被跳蛋高潮一区二区久久w| 日韩精品电影网站| 国产精品成人av| 久久久久久久一| 日本精品久久| 亚洲国产日韩精品在线| 国产黄色片在线观看| 一级中文字幕一区二区| 久久在线中文字幕| 久久精品国产999大香线蕉| 成人国产亚洲精品a区天堂华泰| 视频精品二区| 亚洲精品在线观看www| 美足av综合网| 欧美三级日韩三级| 最新天堂资源在线资源| 国产欧美一区二区精品久导航 | 亚洲天堂一区二区| 亚洲人成电影网站色…| 国产精品高清乱码在线观看| 亚洲日韩欧美视频| 自拍偷拍亚洲| 91国语精品自产拍在线观看性色 | av高清久久久| 5月婷婷6月丁香| 国产日韩精品一区二区浪潮av| 国产成人无码av在线播放dvd| 国产午夜精品久久久久久免费视| 熟女视频一区二区三区| 免费不卡av| 狠狠综合久久av一区二区小说 | 手机在线一区二区三区| 91精品视频在线播放| 欧美国产一级| 国产情人节一区| 日韩欧美高清| www国产亚洲精品| 在线一区免费观看| 日韩精品久久久毛片一区二区| 青青青爽久久午夜综合久久午夜| 欧美aaa在线观看| 国产校园另类小说区| 免费网站www在线观看| 欧美性xxxxx极品娇小| 91这里只有精品| 精品国产成人系列| 亚洲天堂网站| 91精品国产综合久久香蕉的用户体验| 欧美一区二区三区另类| 欧美日韩中文国产一区发布| 成人av资源网站| h网站在线播放| 91精品国产综合久久久久久久| jizzjizzjizz亚洲| 国产成人av一区二区| 国外成人在线视频网站| 91超碰国产精品| 国内成人精品视频| 久久电影tv| 精品成人免费观看| 亚洲美女在线免费观看| 亚洲国产日韩在线一区模特| 国产网红在线| 久久久久久免费毛片精品| 91社在线播放| 91香蕉视频mp4| 国产一级在线观看| 色偷偷综合社区| 午夜影院欧美| 草b视频在线观看| 亚洲美女在线一区| 久久五月精品| 欧美整片在线观看| 免费亚洲一区| 丁香视频免费观看| 日韩欧美中文一区| 国产不卡一区| 欧美一区二区影视| 国产精品乱人伦中文| 1区2区3区在线视频| 97视频网站入口| 久久99精品久久久久婷婷| 亚洲一级片网站| 欧美一区二区在线视频| 99久久香蕉| 亚洲成色www久久网站| 亚洲欧美激情小说另类| 123成人网| 国产在线一区二区三区四区| 国产视频在线观看一区二区三区| 国产精品国精产品一二| 国产成人精品一区二区三区| www.欧美.com| 蜜桃视频动漫在线播放| 91夜夜未满十八勿入爽爽影院| 久久久久久久久免费| 成人国产电影在线观看| 久久精品magnetxturnbtih| 欧美日韩国产精品一区二区三区四区 | 日韩一区二区在线视频| 伊人久久成人| xxxxx中文字幕| 中文字幕一区二区精品| 免费国产亚洲视频| www 日韩| 国产精品手机播放| 中文字幕的久久| 99亚洲伊人久久精品影院| 久久精品国产一区二区三区日韩| 一区二区三区在线影院| 福利欧美精品在线| 热99这里只有精品| 中文字幕日韩电影| 麻豆成人91精品二区三区| 成人在线免费电影| 免费看成人片| 欧美日韩另类国产亚洲欧美一级| 亚洲无中文字幕| 在线观看免费毛片| 91精品啪aⅴ在线观看国产| 亚洲高清视频中文字幕| 怕怕欧美视频免费大全| 国产成+人+亚洲+欧美+综合| 青青草原一区二区| 天天色天天操综合| 亚洲福利电影| 黄色在线观看www| av在线播放天堂| 欧美极品在线播放| 亚洲午夜国产一区99re久久| 正在播放日韩欧美一页| 国产欧美黑人| 伊人网在线免费| 色av中文字幕一区| 国产视频一区二区在线观看| 国产精品x8x8一区二区| 最近中文字幕mv2018在线高清| 成人免费淫片视频软件| 欧美刺激午夜性久久久久久久|