国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹

這篇具有很好參考價值的文章主要介紹了Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

這里不涉及到源碼,只是根據(jù)網(wǎng)上的一些文章總結(jié)一下,目前不需要細究,只需要知道大概就好,除非你的工作是二次開發(fā)ES

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
這張圖你可以認為粗糙的描述倒排索引對應(yīng)關(guān)系,下面的文章也是主要講解這張圖各個部分含義

一、?Term Index(詞項索引)

看這個?Term Index是不是特別想樹的數(shù)據(jù)結(jié)構(gòu)?比如二叉樹或者多叉樹?其實是FST,下面看一下它是怎么出來的

1、FSM(Finite State Machine)有限狀態(tài)機

表示有限個狀態(tài)(State)集合以及這些狀態(tài)之間轉(zhuǎn)移和動作的數(shù)學(xué)模型。其中一個狀態(tài)被標記為開始狀態(tài),0個或更多的狀態(tài)被標記為final狀態(tài)。來自[轉(zhuǎn)]ElasticSearch 查詢的秘密

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
這種模型使用原型的節(jié)點標示某個“狀態(tài)”,狀態(tài)之間可以互相轉(zhuǎn)換,但是轉(zhuǎn)換過程是無向的。
比如睡覺醒了可以去工作,工作累了可以去玩手機;或者工作中想去上廁所等等。
在這個模型中,標示狀態(tài)的節(jié)點是有限多個的,但狀態(tài)的轉(zhuǎn)換的情況是無限多的,同一時刻只能處于某一個狀態(tài),并且狀態(tài)的轉(zhuǎn)換是無序切循環(huán)的。
顯然這種模型并不適用于描述Term Dictionary這樣的數(shù)據(jù)結(jié)構(gòu),所以再看一下演變的FSA

2、FSA(Finite State Acceptor)確定無環(huán)有限狀態(tài)接收機

相較于FSM,FSA增加了EntryFinal的概念,這樣就增加了如下3個特性
1、確定:意味著指定任何一個狀態(tài),只可能最多有一個轉(zhuǎn)移可以訪問到。
2、無環(huán): 不可能重復(fù)遍歷同一個狀態(tài)
3、接收機:有限狀態(tài)機只“接受”特定的輸入序列,并終止于final狀態(tài)。
來自:關(guān)于Lucene的詞典FST深入剖析

我們?nèi)绾蝸肀硎局挥幸粋€key:jul 的集合。FSA是這樣的:
Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
當查詢這個FSA是否包含“jul”的時候,按字符依序輸入。

輸入j,F(xiàn)SA從0->1
輸入u, FSA從1->2
輸入l,F(xiàn)SA從2->3
這個時候,F(xiàn)SA處于final狀態(tài)3,所以jul是在這個集合的。

增加一個key:mar 就如下表
Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
再增加一個key:jun
Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
遍歷算法是這樣的:

初始狀態(tài)0, key=””
->1, key=”j”
->2, key=”ju”
->3, key=”jul”, 找到j(luò)ul
2<-, key=”ju”
->3, key=”jun”, 找到j(luò)un
2<-, key=”ju”
1<-, key=”j”
0<-, key=””
->4, key=”m”
->5, key=”ma”,
->3, key=”mar”,找到mar
這個算法時間復(fù)雜度O(n),n是集合里所有的key的大小, 空間復(fù)雜度O(k),k是結(jié)合內(nèi)最長的key字段length。

再看一下更復(fù)雜的,由“october”,“november”,”december”構(gòu)成的FSA
Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
所以FSA不光共用前綴,后綴也一樣可以共用

即使FSA已經(jīng)滿足了對Term Dictionary數(shù)據(jù)高效存儲的基本要求,但是仍然不滿足的一個問題就是,F(xiàn)SA無法存儲key-value的數(shù)據(jù)類型,

3、FST(Deterministic acyclic finite state transducer)確定無環(huán)狀態(tài)轉(zhuǎn)換器

FSTFSA基礎(chǔ)上為每一個出度添加了一個output屬性,用來表示每個termvalue值,
來自:倒排索引:ES倒排索引底層原理及FST算法的實現(xiàn)過程

下面拿key:msb輸出 要輸出一個value:10 和再新增一個key:msbtech輸出一個value:5的FST是如何構(gòu)建的

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
當?shù)谝粋€term:msb被寫入FST中,其輸出值被保存在了其第一個節(jié)點的出度上,在數(shù)據(jù)從FST中讀取的時候, 計算其每個節(jié)點對應(yīng)的出度的輸出值以及終止節(jié)點的final output值的累加和,從而得出輸出值,此時msb的輸出值就是10+0+0+0=10,但是這里我用0來標識沒有輸出值,但實際情況沒有輸出值就是空而不是0,這里寫0只是為了方便你去理解,這一點是需要注意的。

當?shù)诙€term:msbteach被寫入的時候,其輸出值5與msb的輸出值10發(fā)生了沖突,這時,通用最小化算法法則發(fā)揮了功效。數(shù)字雖然不能像字符那樣以前綴作為復(fù)用手段,但是數(shù)字是可以累加的,10可以拆成兩個數(shù)字5,這樣10和5就產(chǎn)生了公共部分,即5,所以這個時候m的輸出值就需要改成5,那另一個5就需要找一個合適的位置,然而把它存放在任何一個節(jié)點的出度上似乎都會影響msbtech的計算結(jié)果,為了避免這個問題,可以把這個多出來的屬于msb的輸出值存入msb的final節(jié)點的final output中,節(jié)點的final output只會在當前出度是輸入值的最后一個字符并且出度的target指向的是final節(jié)點的時候,才會參與計算。因此此時的msbmsbtech就各自把輸出值存入了合適的位置,互不影響而且做到了“通用最小化”原則。

所以大體上就知道了?Term Index 中的FST是怎樣的數(shù)據(jù)結(jié)構(gòu)了

二、Term Dictionary(詞項字典)

這個就比較直白,就是各個分詞后的字段列表
來自:倒排索引:ES倒排索引底層原理及FST算法的實現(xiàn)過程

下面拿右邊的做一個例子,這樣Term Dictionary會把右邊的表中product字段的內(nèi)容分詞,分成左邊的表格中的樣例

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
但是既然都已經(jīng)知道上面的term index了,那看存儲詞項索引的文件.tip數(shù)據(jù)結(jié)構(gòu)和輸出如何映射到詞項字典文件.tim

詞項字典包含了index field的所有經(jīng)過normalization token filters處理之后的詞項數(shù)據(jù),最終存儲在.tim文件中。
所謂normalization其實是一個如去重、時態(tài)統(tǒng)一、大小寫統(tǒng)一、近義詞處理等類似的相關(guān)操作;詞項索引就是為了加速詞項字典檢索的一種數(shù)據(jù)結(jié)構(gòu),落地文件為.tip

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
所以,詞項字典也是存儲了很多東西的,一個block代表像小米、手機這樣的分詞塊

三、Posting List(倒排表)

倒排表這里主要說一下兩種壓縮算法,因為都知道倒排表存儲的是詞項字典對應(yīng)的文檔的id,那如何存儲的呢?因為要考慮到量的問題,雖然不是文檔本身,但是id這個字段存儲幾十億的量還是挺大的

1、FOR(Frame Of Reference)壓縮算法(差值存儲)

即不存儲原本的數(shù)值,而是存儲每個數(shù)值與前一個數(shù)字的差值,這個適用于id之間差值都很小,或者只有幾個id之間差值大的場景,這種數(shù)組也叫稠密數(shù)組
下面以某個id的集合是[1,2,3…100萬]和[73,300,302,332,343,372]舉例

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
如果是[1,2,3…100萬],用差值存儲你可能就知道為什么這么做了,節(jié)省的空間存儲很多,壓縮了32倍。

下面又用了一個特殊的例子[73,300,302,332,343,372]來演示特殊的情況,就是某兩個id之間差值之間太大的情況,數(shù)組經(jīng)過拆分,分為了兩個數(shù)組,第一個數(shù)組每個數(shù)字占用1個Byte,共兩個數(shù)字,總占用為2Bytes,記錄數(shù)組單位大小的Record Space大小為1Byte,第二個數(shù)組每個數(shù)字占用5個bit,一共四個數(shù)字,共計20bit,但是計算空間的最小單位是Byte,所以實際占用的大小為3Bytes,第二個數(shù)組的Record Space大小也是1Byte,因此壓縮后的數(shù)據(jù)總大小為1B+2x1B+3B+1B=7Bytes,相比壓縮之前,大小不到原先的三分之一。

但是可能還有更特殊的,每一個id之間相差都很大,就有了下面這種壓縮算法RBM

2、RBM(RoaringBitmap)壓縮算法(32位int拆成兩個16位的short存儲)

針對id數(shù)據(jù)大部分id之間差值都很大,用差值存儲壓縮不了多少的情況,這里稱這種數(shù)組為稀疏數(shù)組,Lucene對于這種稀疏數(shù)組采用了另一種壓縮算法
下面用 [1000,62101,131385,132052,191173,196658] 這種典型稀疏數(shù)組為例

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)
RBM算法本身的設(shè)計思路是將原數(shù)字的的32個bit分為了高16位低16位。以原數(shù)組中的196658這個id為例,將其轉(zhuǎn)化為二進制結(jié)果為 110000000000110010,我們看到其實結(jié)果是不足32bits的,但因為每個int型都是有32個bit組成的,不足32bit會在其前面補0,實際其占用的空間大小仍然為32bits,如果這一點不理解,打個比方,公交車有32個座位,無論是否坐滿,都是使用了32個座位。最終196658轉(zhuǎn)換成二進制就是0000 0000 0000 0011 0000 0000 0011 0010,前16位就是高16位,轉(zhuǎn)換成十進制就是3,后16位也就是低16位,轉(zhuǎn)換成十進制就是50

到這一步其實你有疑問?拆開空間也沒有變小啊,還是32bits?。磕强梢岳^續(xù)往下看

對數(shù)組中每個數(shù)字進行相同的操作,會得到以下結(jié)果:(0,1000)(0,62101)(2,313)(2,980)(2,60101)(3,50),其含義就是每個數(shù)字都由一個很大的數(shù)字變?yōu)榱藘蓚€很小的數(shù)字,并且這兩個數(shù)字都不超過65536,更重要的是,當前結(jié)果是非常適合壓縮的,因為不難看出,出現(xiàn)了很多重復(fù)的數(shù)字,

比如前兩個數(shù)字的得數(shù)都是0,以及第2、3、4個數(shù)字的得數(shù)都是2。RBM使用了非常適合存儲當前結(jié)果的數(shù)據(jù)結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)是一種類似于哈希的結(jié)構(gòu),只不過Key值是一個short有序不重復(fù)數(shù)組,用于保存每個商值,value是一個容器保存了當前Key值對應(yīng)的所有模,這些模式不重復(fù)的,因為同一個商值的余數(shù)是不會重復(fù)的。

這里的容器官方稱之為Container,RBM中包含三種Container,分別是ArrayContainer、BitmapContainer和RunContainer,

(1)ArrayContainer

ArrayContainer,顧名思義,Container中實際就是一個short類型的數(shù)組,其空間占用的曲線如圖3-4中的紅色線段,注意這里是線段,因為docs的數(shù)量最大不會超過65536,其函數(shù)為 y(空間占用)=x(docs 長度) x 2Bytes,當長度達到65536極限值的時候,其占用的大小就是16bit * 65536 / 8 /1024 = 128KB,乘以65536是總bit數(shù),除以8是換算成Byte,除以1024是換算成KB。

Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)

(2)BitmapContainer

第二種是BitmapContainer,理解BitmapContainer之前首先要了解什么是bitmap。以往最常見的數(shù)據(jù)存儲方式都是二進制進位存儲,比如我們使用8個bit存儲數(shù)字,如果存十進制0,那二進制就是 0 0 0 0 0 0 0 0,如果存十進制1,那就是 0 0 0 0 0 0 0 1,如果存十進制2,那就是 0 0 0 0 0 0 1 1,用到了第二個bit。這種做法在當前場景下存儲效率顯然不高,如果我們現(xiàn)在不用bit來存儲數(shù)據(jù),而是用來作為“標記”,即標記當前bit位置商是否存儲了數(shù)字,出的數(shù)字值就是bit的下標,如下圖所示,就表示存儲了2、3、5、7四個數(shù)字,第一行數(shù)字的bit僅代表當前index位置上是否存儲了數(shù)字,如果存儲了就記作1,否則記為0,存儲的數(shù)字值就是其index,并且存儲這四個數(shù)字只使用了一個字節(jié)。
Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹,# ElasticSearch,elasticsearch,大數(shù)據(jù)

不過這種存儲方式的問題就是,存儲的數(shù)字不能包含重復(fù)數(shù)字,并且Bitmap的大小是固定的,不管是否存儲了數(shù)值,不管存儲了幾個值,占用的空間都是恒定的,只和bit的長度有關(guān)系。
但是我們剛才已經(jīng)說過,同一個Container中的數(shù)字是不會重復(fù)的,因此這種數(shù)據(jù)類型正好適合用這種數(shù)據(jù)結(jié)構(gòu)作為載體,而因為我們Container的最大容量是65536,因此Bitmap的長度固定為65536,也就是65536個bit,換算成千字節(jié)就是8KB,如圖的藍色線段所示,即Lucene的RBM中BitmapContainer固定占用8KB大小的空間,
通過對比可以發(fā)現(xiàn),當doc的數(shù)量小于4096的時候,使用ArrayContainer更加節(jié)省空間,當doc數(shù)量大于4096的時候,使用BitmapContainer更加節(jié)省空間

(3)RunContainer

第三種Container叫RunContainer,這種類型是Lucene 5之后新增的類型,主要應(yīng)用在連續(xù)數(shù)字的存儲商,比如倒排表中存儲的數(shù)組為 [1,2,3…100W] 這樣的連續(xù)數(shù)組,如果使用RunContainer,只需存儲開頭和結(jié)尾兩個數(shù)字:1和100W,即占用8個字節(jié)。這種存儲方式的優(yōu)缺點都很明顯,它嚴重收到數(shù)字連續(xù)性的影響,連續(xù)的數(shù)字越多,它存儲的效率就越高。文章來源地址http://www.zghlxwxcb.cn/news/detail-776164.html

到了這里,關(guān)于Elasticsearch 查詢命令執(zhí)行時,如何通過詞項索引、詞項字典、倒排表定位文檔邏輯介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • (十)ElasticSearch高級使用【別名,重建索引,refresh操作,高亮查詢,查詢建議】

    在開發(fā)中,隨著業(yè)務(wù)需求的迭代,較?的業(yè)務(wù)邏輯就要?臨更新甚?是重構(gòu),?對于es來說,為了 適應(yīng)新的業(yè)務(wù)邏輯,可能就要對原有的索引做?些修改,?如對某些字段做調(diào)整,甚?是重建索 引。?做這些操作的時候,可能會對業(yè)務(wù)造成影響,甚?是停機調(diào)整等問題。由此

    2024年02月02日
    瀏覽(97)
  • 通過空間占用和執(zhí)行計劃了解SQL Server的行存儲索引

    索引是一種幫助查詢語句能夠快速定位到數(shù)據(jù)的一種技術(shù)。索引的存儲方式有行存儲索引、列存儲索引和內(nèi)存優(yōu)化三種存儲方式: 行存儲索引,使用B+樹結(jié)構(gòu),行存儲指的是數(shù)據(jù)存儲格式為堆、聚集索引和內(nèi)存優(yōu)化表的表,用于OLTP場景。行存儲索引按順序排列的值列表,每個

    2024年02月04日
    瀏覽(25)
  • Python連接Elasticsearch查詢索引字段命中數(shù)詳解

    Python連接Elasticsearch查詢索引字段命中數(shù)詳解

    ?? 個人網(wǎng)站:ipengtao.com Elasticsearch是一款強大的搜索和分析引擎,通過其RESTful API,可以方便地與其交互。本篇文章將深入探討如何使用Python連接Elasticsearch,并通過查詢索引某個字段的命中數(shù)來實現(xiàn)數(shù)據(jù)統(tǒng)計的目的。將介紹基礎(chǔ)的Elasticsearch查詢、高級的聚合查詢以及一些常

    2024年02月04日
    瀏覽(98)
  • 【ElasticSearch】ElasticSearch Java API的使用——常用索引、文檔、查詢操作(二)

    Elaticsearch ,簡稱為es,es是一個開源的 高擴展 的 分布式全文檢索引擎 ,它可以近乎 實時的存儲 、 檢索數(shù)據(jù); 本身擴展性很好,可以擴展到上百臺服務(wù)器,處理PB級別(大數(shù)據(jù)時代)的數(shù)據(jù)。es也使用java開發(fā)并使用Lucene作為其核心來實現(xiàn)所有索引和搜索的功能,但是它的 目的

    2024年01月16日
    瀏覽(124)
  • Elasticsearch 通過索引阻塞實現(xiàn)數(shù)據(jù)保護深入解析

    Elasticsearch 通過索引阻塞實現(xiàn)數(shù)據(jù)保護深入解析

    目錄 前言 1、索引阻塞的種類 2、什么時候使用阻塞? 場景1:進行系統(tǒng)維護場景。 場景2:保護數(shù)據(jù)不被隨意更改場景。 場景3:優(yōu)化資源使用的場景。 場景4:遵守安全規(guī)則場景。 3、添加索引阻塞API 4、解除設(shè)置 API 5、小結(jié) 6、參考 Elasticsearch是一種強大的搜索和分析引擎,

    2024年03月13日
    瀏覽(20)
  • ElasticSearch 實戰(zhàn):ES查詢索引文檔的6種方法

    在Elasticsearch中,查詢索引文檔的方法多種多樣,這里列舉了6種常見的查詢方法,其中包括: 簡單查詢(String Query) 這是最基本的全文搜索,只需在URL后面附加查詢字符串即可。例如,對索引 my_index 中的所有文檔執(zhí)行模糊匹配查詢: Match Query 類似于簡單查詢,但提供了更多的

    2024年04月12日
    瀏覽(20)
  • ElasticSearch刪除索引的命令

    ElasticSearch刪除索引的命令 當前命令操作是在Kibana中操作 刪除單個索引 DELETE 索引名稱 刪除多個索引 DELETE 索引名稱1,索引名稱2 刪除全部索引 刪除索引的中的全部數(shù)據(jù) 注意 Elasticsearch查詢刪除的時候,不是立即刪除。在執(zhí)行刪除操作時,Elasticsearch會先將要刪除的文檔標記為

    2024年04月15日
    瀏覽(23)
  • 如果elasticsearch要實現(xiàn)在大于兩個索引之間關(guān)聯(lián)查詢怎么實現(xiàn)

    Elasticsearch可以通過多種方式在多個索引之間進行關(guān)聯(lián)查詢。 一種常用的方法是使用關(guān)聯(lián)查詢(join query), 這需要在索引和類型中使用 _join 字段來存儲關(guān)聯(lián)關(guān)系。 另一種方法是使用查詢時連接(query time join),使用過濾器上下文來連接不同索引中的文檔。 還可以使用 Elasticsearch 的聚

    2024年02月08日
    瀏覽(35)
  • Java操作elasticSearch復(fù)雜查詢以及解析數(shù)據(jù)以及索引保存數(shù)據(jù)

    Java操作elasticSearch復(fù)雜查詢以及解析數(shù)據(jù)以及索引保存數(shù)據(jù)

    說明:基于銀行測試庫的操作 es的銀行測試庫,看一個Kibana操作 然后用java檢索解析這個數(shù)據(jù) 聚合搜索 address 中包含 mill 的所有人的年齡分布以及平均薪資 以下是分解思路實現(xiàn)步驟: #聚合搜索 address 中包含 mill 的所有人的年齡分布以及平均年齡 GET bank/_search { “query”:{ “

    2024年02月10日
    瀏覽(27)
  • 【Elasticsearch】ES精確查詢和范圍查詢,ES時間字段排序?qū)嵗?,ES倒排索引介紹

    【Elasticsearch】ES精確查詢和范圍查詢,ES時間字段排序?qū)嵗?,ES倒排索引介紹

    termQuery matchQuery 模糊查詢 multiMatchQuery 多個字段模糊查詢 如果時間字段寫入時用的類型是Text,可以用“時間字段.keyword”來處理 #查詢前傳入分頁參數(shù) #分頁后拿到總記錄數(shù) 把文檔D對應(yīng)到的映射轉(zhuǎn)換為到文檔ID的映射,每個都對應(yīng)著一系列的文檔,這些文

    2024年02月15日
    瀏覽(126)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包