導航:首頁 > 數據處理 > 倒排索引用的什麼數據結構

倒排索引用的什麼數據結構

發布時間:2023-04-15 06:45:08

❶ elasticSearch理論篇—索引、節點、分片

傳統我們檢索文章,是逐個遍歷找到對應關鍵詞的位置;

而倒排索引,是通過分詞策略,形成詞與文章的映射關系表,這種詞典+映射表即為倒排索引。

倒排索引的底層實現是基於:FST(Finite State Transcer)數據結構。
lucene [lu'sen] 從4+版本後開始大量使用的數據結構是FST。FST有兩個優點:

利用es的分片預分配。

不能,因為分片數是 文檔路由演算法 中重要的元素:

shard = hash(routing) % number_of_primary_shards

動態修改分片將意味著幾乎重新索引文檔數據,這是比僅僅將分片從一個節點復制到另一個節點更重量級的操作。

一個分片存在於單個節點,一個節點可以包含多個分片。

elasticSearch天然具有分布式的特徵,實現水平擴容時通過 分片預分配 。在創建索引時,選擇合適的分片數。

隨著數據量的增加,可以動態的增加節點數,elasticSearch將會自動將分片分配到新增的節點上,當重新分配完成時,每個分片將會有接近至少兩倍於之前的運算速度。

elasticSearch中新添加的索引默認被指定了5個主分片。這意味著我們最多可以將那個索引分散到5個節點上,每一個節點一個分片。

不能,一個分片並不是沒有代價的。

es適當的預分配是好的,但是上千個分片就有些糟糕。

ElasticSearch推薦的最大JVM堆空間是30~32G, 所以把你的分片最大容量限制為30GB, 然後再對分片數量做合理估算. 例如, 你認為你的數據能達到200GB, 推薦你最多分配7到模瞎8個分片。
在開始階段, 一個好的方案是根據你的節點數量按照1.5~3倍的原則來創建分片. 例如,如果你有3個節點, 則推薦你創建的分片數最多不超過9(3x3)個。當性能下降時,增加節點,ES會平衡分片的放置。
對於基於日期的索引需求, 並且對索引數據的搜索場景非常少. 也許這些索引量將達到成百上千, 但每個索引的數據量只有1GB甚至更小. 對於這種類似場景, 建議只需要為索引分配1個分片。如日誌管理就是一個日期的索引需求,日期索引會很多,但每個索引存放的日誌數據量就很少。

副本分片 可以實現高可用。當持有主分片的節點掛掉之後,一個副本分片將會晉升為主分片的角色。

在並碼賀索引寫入時,副本分片做著和主分片相同的工作。新文檔首先被索引進主分片然後在同步到其他所有的副本分片。增加副本分片並不會增加索引容量。

副本分片可以服務於讀請求,如果索引偏向查詢,那麼可以通過增加副本的數目來提升查詢性能。但也要為絕派此增加額外的硬體資源。

當使用上面配置時,每一個分片的副本分片數量為1個。

一個擁有兩個主分片一份副本的索引可以在四個節點中橫向擴展

Elasticsearch: 權威指南 » 數據建模 » 擴容設計 » 擴容的單元

面試官:Elasticsearch如何設計索引?滿分答案來了

elasticsearch 設置多少分片合適

新年手打,24道進階必備Elasticsearch 面試真題(建議收藏!)

❷ 正排索引和倒排索引

倒排索引 (英語:Inverted index),也常被稱為 反向索引 置入檔案 反向檔案 ,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。它是文檔檢索系統中最常用的數據結構。

有兩種不同的反向索引形式:

一條記錄的水平反向索引(或者反向檔案索引)包含每個引用單詞的文檔的列表。
一個單詞的水平反向索引(或者完全反向索引)又包含每個單詞在一個文檔中的位置。
後者的形式提供了更多的兼容性(比如短語搜索),但是需要更多的時間和空間來創建。

所謂的正排索引是從索引文檔到關鍵詞到內容,倒排索引則是相反從關鍵詞到詞頻,位置,目錄等信息,現在通常用於搜索的。由於互聯網上的數據量無限大,不可能存儲足夠多的文檔,所以正排索引用處不大。

有兩種不同的反向索引形式:

​我們就能得到下面的反向文件索引:

對相同的文字,我們得到後面這些完全反向索引,有文檔數量和當前查詢的單詞結果組成的的成對數據。 同樣,文檔數量和當前查詢的單詞結果都從零開始。所以, "banana": {(2, 3)} 就是說 "banana"在第三個文檔里 ( {displaystyle T_{2}} T_{2}),而且在第三個文檔的位置是第四個單詞(地址為 3)。

如果我們執行短語搜索"what is it" 我們得到這個短語的全部單詞各自的結果所在文檔為文檔0和文檔1。但是這個短語檢索的連續的條件僅僅在文檔1得到。

反向索引數據結構是典型的搜索引擎檢索演算法重要的跡差洞部分。
一個搜索引擎執行的目標就是優化查詢的速度:找到某個單詞在文檔中出現的地方。以前,正向索引開發出來用來存儲每個文檔的單詞的列表,接著掉頭來開發了一種反向索引。 正向索引的查詢往往滿足每個文檔有序頻繁的全文查詢和每個單詞在校驗文檔中的驗證這樣的查詢。
實際上,時間、內存、處理器等等資源的限制,技術上正向索引是不能實現的。
為了替代正向索引的每個文檔的單詞列表,能列出每個查詢的單詞所有所在文檔的列表的反向索引數據結構開發了出來。
隨著反向索引的創建,如今的查詢能通過立即的單詞標示迅速獲取結果(經過隨機存儲)。隨機存儲也通常被認為快於順序存儲。

索引的構建[4] 相當於從正排表到倒排表的建立過程。當我們分析完網頁時 ,得到的是以網頁為主碼的索引表。當索引建立完成後 ,應得到倒排表 ,具體流程如圖所示:
流程描述如下:
1)將文檔分析稱單詞term標記,
2)使用hash去重單詞term
3)對單詞生成倒排列表
倒排列表就是文檔編號DocID,沒有包含其他的信息(如詞頻,單詞位置等),這就是姿枯簡單的索引。
這個簡單索引功能可以用於小數據,例如索引幾千個文檔。然而它有兩點限制:
1)需要有足夠的內存來存儲倒排表,對於搜索引擎來說, 都是G級別數據,特別是當規模不斷擴大時 ,我們根本不可能提供這么多的內存。
2)演算法是順序執行,不便於並行處理。

歸並法[4] ,即每次將內存中數據寫入磁碟時,包括詞典在內的所有中間結果信息都被寫入磁碟,這樣內存所有內容都可以被清空慶晌,後續建立索引可以使用全部的定額內存。
歸並索引
歸並索引
如圖 歸並示意圖:
合並流程:
1)頁面分析,生成臨時倒排數據索引A,B,當臨時倒排數據索引A,B占滿內存後,將內存索引A,B寫入臨時文件生成臨時倒排文件,
2) 對生成的多個臨時倒排文件 ,執行多路歸並 ,輸出得到最終的倒排文件 ( inverted file)。
合並流程
合並流程
索引創建過程中的頁面分析 ,特別是中文分詞為主要時間開銷。演算法的第二步相對很快。這樣創建演算法的優化集中在中文分詞效率上。

❸ 什麼是倒排索引

倒排索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(inverted index)。帶有倒排索引的文件我們稱為倒排索引文件,簡稱倒排文件。建立全文索引中有兩項非常重要,一個是如何對文本進行分詞,一是建立索引的數據結構。分詞的方法基本上是二元分詞法、最大匹配法和統計方法。索引的數據結構基本上採用倒排索引的結構。
分詞的好壞關繫到查詢的准確程度和生成的索引的大小。在中文分詞發展中,早期經常使用分詞方式是二元分詞法,該方法的基本原理是將包含中文的句子進行二元分割,不考慮單詞含義,只對二元單詞進行索引。因此該方法所分出的單詞數量較多,從而產生的索引數量巨大,查詢中會將無用的數據檢索出來,好處是演算法簡單不會漏掉檢索的數據。之後又發展出最大匹配分詞方法,該方法又分為正向最大分詞和逆向最大分詞。其原理和查字典類似,對常用單詞生成一個詞典,分析句子的過程中最大的匹配字典中的單詞,從而將句子拆分為有意義的單詞鏈。最大匹配法中正向分詞方法對偏正式詞語的分辨容易產生錯誤,比如「首飾和服裝」會將「和服」作為單詞分出。達夢資料庫採用的是改進的逆向最大分詞方法,該分詞方法較正向正確率有所提高。最為復雜的是通過統計方式進春掘行分詞的方法。該方法採用隱式馬爾科夫鏈,也就是後一個單詞出現的概率依靠於前一個單詞出現的概率,最後統計所有單詞出現的概率的最大為分詞的依據。這個方法對新名詞和地名的識別要遠遠高於最大匹配法,准確度隨著取樣文本的數量的增大而提高。
二元分詞方法和統計方法是不依賴於詞典的,而最大匹配法分詞方法是依賴於詞典的,詞典的內容決定分詞結構的好壞。
全文檢索的索引被稱為倒排索引,之所以成為倒排索引,是因為將每一個單詞作為索引項,根據該索引項查找包含該單詞的文本。因此,索引都是單詞和唯一記錄文本的標示是一對多的關系。將索引單詞排序,根據排序後的單詞定位包含該單詞的文本。
步驟1)讀取一整條句子到變數str中,轉到步驟2

步驟2)從句子的尾端讀取1個字到變數word中,轉到步驟3

步驟3)在旅森冊字典查找word中保存的單詞。如果存在則保存word,轉到步驟4,否則轉到步驟5)

步驟4)如果是字典中拆宏最大單詞或者超過最大單詞數(認定為新詞),從句尾去掉該單詞,返回步驟2

步驟5)讀取前一個字到word中,構成新單詞,轉到步驟3)

詞庫的內存數據結構和詞庫中單詞的匹配演算法

內存中單詞採用層次結構保存

假設字典中有如下的單詞:中國 中華民國 國家 人民 民主

在內存中按照如下方式按層排列,其中每一個方塊代表一個字,箭頭所指向為該單詞的前一個字

❹ Elasticsearch

Elasticsearch是一個基於Lucene的實時分布式的搜索與分析引擎。Elasticsearch為所有類型的數據提供近乎實時的搜索和分析。無論結構化或非結構化文本、數字數據還是地理空間數據,Elasticsearch都可以有效地存儲和索引,以支持快速搜索。隨著你的數據和查詢量的增長,Elasticsearch的分布式特性使部署能夠隨著它而無縫增長。

Elasticsearch是一個 分布式文檔存儲 。Elasticsearch不是將信息存儲為列式數據行,而是存儲已序列化為JSON文檔的復雜數據結構。當集群中有多個Elasticsearch節點時,存儲的文檔會分布在整個集群中,並且可以從任絕掘族何並弊節點立即訪問。

存儲文檔後,它會在近乎實時的情況下被索引並完全可搜索——1秒內。Elasticsearch使用一種稱為倒排索引的數據結構,它支持非常快速的全文搜索。倒排索引列出了出現在任何文檔中的每個唯一單詞,並標識了每個單詞出現的所有文檔。

索引是文檔的優化集合,每個文檔都是欄位的集合,欄位是包含數據的鍵值對。 默認情況下,Elasticsearch對每個欄位中的所有數據進行索引,並且每個索引欄位都有一個專用的優化數據結構。

Elasticsearch還具有無預定數據模式(schema-less)的能力,這意味著無需明確指定如何處理文檔中可能出現的每個不同欄位即可對文檔進行索引。啟用動態映射後,Elasticsearch會自動檢測新欄位並將其添加到索引中。只要開始索引文檔,Elasticsearch就會檢測並將布爾值、浮點和整數值、日期和字元串映射到適當的Elasticsearch數據類型。也可以定義規則來控制動態映射,明確定義映射以完全控制欄位的存儲和索引方式。

Elasticsearch提供了一個簡單REST API,用於管理集群以及索引和搜索數據。可以直接從命令行、應用程序客戶端或通過Kibana中的開發者控制台輕松提交請求。

Elasticsearch REST API支持結構化查詢、全文查詢和將兩者結合的復雜查詢。結構化查詢類似於在SQL中構造的查詢類型。全文查詢查找與查詢字元串匹配的所有文檔,並按與搜索詞的匹配程度對它們進行排序。

除了搜索單個術語之外,還可以執行短語搜索、相似性搜索和前綴搜索。可以使用 Elasticsearch全面的JSON樣式查詢語言 (Query DSL) 訪問所有這些搜索功能。 您還可以構建SQL樣式的查詢以在Elasticsearch內本地搜索和聚合數據。

建議使用三個主節點三個數據節點集群,這里是演示

環境規劃

Index moles

Index management

可以通過Kibana Management或ILM API創建和管理索引生命周期策略。當您為Beats或Logstash Elasticsearch輸出插件啟用索引生命周期管理時,默認策略是自動配置的。

索引生命周期階段共分為五個階段:

在為日誌或指標等時間序列數據編制索引時,不能無限期地寫入單個索引。 為了滿足索引和搜索性能要求並管理資源使用情況,寫入索引直到滿足某個閾值,然後創建一個新索引並開始寫入它。 使用滾動索引能夠達到以下效果:

ILM能夠根據索引大小、文檔計數或年齡自動滾動到新索引。 當觸發 Rollover 時,會創建一個新索引,寫入別名會更新為指向新索引,所有後續更新都會寫入新索引。散舉

索引生命周期操作

配置生命周期策略

啟動和停止索引生命周期管理

命令使用均已運行用戶執行

elasticsearch-keystore 命令管理 Elasticsearch 密鑰庫中的安全設置。

elasticsearch-node命令能夠在節點上執行某些不安全的操作,這些操作只能在關閉時執行。 此命令允許您調整節點的角色,不安全地編輯集群設置,並且即使在與磁碟上的數據不兼容的情況下,也可以在災難後恢復某些數據或啟動節點。

創建、列出和刪除基於文件的服務賬戶令牌。當創建第一個服務帳戶令牌時,此命令會在 $ES_HOME/config 目錄中創建一個 service_tokens 文件。 該文件默認不存在。Elasticsearch監視此文件的更改並動態重新載入它.

設置內置用戶的密碼。此命令僅供在Elasticsearch安全功能的初始配置期間使用。 它使用彈性引導密碼來運行用戶管理API請求。 如果Elasticsearch密鑰庫受密碼保護,則必須先輸入密鑰庫密碼,然後才能為內置用戶設置密碼。 為彈性用戶設置密碼後,引導密碼不再有效,無法使用該命令。

在某些情況下,分片副本的Lucene索引或事務日誌可能會損壞。 elasticsearch-shard命令能夠在無法自動恢復或從備份恢復的分片的良好副本時刪除分片的損壞部分。運行elasticsearch-shard時,將丟失損壞的數據。在運行elasticsearch-shard之前停止Elasticsearch。

使用基於文件的用戶身份驗證,則可以使用elasticsearch-users命令添加和刪除用戶、分配用戶角色和管理密碼。

參考官方文檔 REST APIs

快照是從正在運行的Elasticsearch集群中獲取的備份。 可以拍攝整個集群的快照,包括其所有數據流和索引。 還可以僅對集群中的特定數據流或索引進行快照。必須先注冊快照存儲庫,然後才能創建快照。

Elasticsearch以增量方式進行快照:快照過程只將數據復制到存儲庫中,而之前的快照還沒有復制到那裡,避免了不必要的重復工作或存儲空間。這意味著可以安全地以最小的開銷頻繁地進行快照。這種增量只適用於單個存儲庫,因為存儲庫之間沒有數據共享。快照在邏輯上也是相互獨立的,即使是在一個存儲庫內:刪除一個快照不會影響任何其他快照的完整性。

可以將快照恢復到正在運行的集群中,默認情況下包括快照中的所有數據流和索引。 也可以選擇僅從快照恢復集群狀態或特定數據流或索引。

可以使用快照生命周期管理來自動拍攝和管理快照。

快照包含構成索引或數據流支持索引的磁碟上數據結構的副本。這意味著快照只能被恢復到可以讀取索引的Elasticsearch版本中。版本兼容圖如下:

❺ 索引數據結構都有哪些 分別有什麼區別呢 一般都採用什麼結構的呢

全文索引、聚集索引、哈希索引、b+樹索引等

B+樹的簡單定義:B+樹是為磁碟或其他存儲設備設計的一種平衡查找樹。B+樹中所有記錄都是按鍵值大小順序存放在葉子節點上,各葉子節點通過指針進行連接。

哈希索引(Hash indexes)採用哈希表來對鍵值進行查找,時間復雜度為O(1)。

使用哈希索引時對於鍵值的等值查詢是非常快的,但是其他類型的查詢如范圍查詢、模糊查詢、排序等是不能使用哈希索引的。這是哈希索引使用比較少的主要原因。

聚集索引(Clustered Index)又稱聚簇索引,其葉子節點存放記錄。

每個InnoDB 表有一個特定的索引叫做聚集索引,存儲行的數據。

如果你的表定義了主鍵那麼主鍵就是聚集索引,如果沒有定義主鍵,MySQL 會選擇第一個非空唯一索引列作為聚集索引,如果表中也沒有唯一索引,InnoDB會生成一個類似RowId的隱藏的聚集索引。

全文索引查找條件使用 MATCH AGAINST。

全文索引(Full-text search indexes)使用倒排索引(inverted index)實現。倒排索引會記錄文本中的每個關鍵字出現在文檔中的位置。

❻ 什麼是倒排牽引正排索引和倒排索引的區別

倒排索引也常被稱為反向索引、置入檔案或反向檔案,被用來存儲在全文搜索下某個單詞在一個文檔或者一組碧段文檔中的存儲位置的映射。帶有倒排索引的文件稱為倒排索引文件,簡稱倒排文件。建立全文索引中有兩項非常重要,一運橋個是如何對文本進行分詞,一是建立索引的數據結構。分詞的方法基本上是二元分詞法、最大匹配法和統計方法。索引的數據結構基本上採用倒排索引的結構。

是經過文字,分詞,消噪,去重後,索引悔悄譽程序就能夠提取關鍵詞,根據分詞程序劃分好的詞,把頁面轉化為一個關鍵片語成的集群,同時記錄每一個關鍵詞在頁面上的出現頻率,出現次數,格式,位置,這樣,每個頁面都能夠記錄為一串關鍵詞集全,其中每個關鍵詞的詞頻,格式,位置等權重信息也都記錄在案。

一個文件(網站/網頁)對應許多關鍵詞

一個關鍵詞對應許多文件(網站/網頁)

❼ python倒排索引(Inverted index)

s=raw_input()
lines=s.split(' ')
dictlines=lines[:100]
mydict={}
#read
fori,lineinenumerate(dictlines):
forwordinline.split():
mydict.setdefault(word,[]).append(i+1)
#printindices
forwordinmydict.keys():
print"%s:%s"%(word,",".join(map(str,sorted(mydict[word]))))

defandSearch(words_list):
globalmydict
a=set(range(1,101))
forwordinwords_list:
a=a.intersection(set(mydict[word]))
returna

deforSearch(words_list):
globalmydict
a=set([])
forwordinwords_list:
罩族滾a=a.union(set(mydict[word]))
returna

#Query
index=100
u=lines[index]
whileindex<len(lines):
words_list=u.split()
if":"inu:
ifwords_list[0]=="OR:":
a=orSearch(words_list)
else:
ifwords_list[0]=='AND:':
穗銀物余words_list=words_list[1:]
a=andSearch(words_list)
ifnota:
print",".join(map(str,list(a)))
else:
print"None"
index+=1

大致思想就是這樣。。。。。。。。

閱讀全文

與倒排索引用的什麼數據結構相關的資料

熱點內容
如何通過二維碼查詢產品 瀏覽:325
西安啤酒代理要多少錢 瀏覽:941
聊城人事代理怎麼找工作 瀏覽:530
麻省理工技術學院在哪裡 瀏覽:785
烏海市貨車怎麼進入302市場 瀏覽:654
乳白的產品出現白紋怎麼解決 瀏覽:656
當日交易次數是多少 瀏覽:649
靖江市如何申請農產品深加工補貼 瀏覽:686
哪裡有學習飛行技術的 瀏覽:463
做程序員英語需要多少級 瀏覽:700
國運資本市場在哪裡 瀏覽:906
有什麼技術適合做食品 瀏覽:146
信息化有哪些資源 瀏覽:132
中考信息確認表丟失了怎麼辦 瀏覽:660
丁基下游產品有哪些 瀏覽:404
絕地求生啟動程序放在steam哪裡 瀏覽:941
企業開發微信小程序怎麼設置 瀏覽:4
德技技術公司怎麼樣 瀏覽:188
什麼是二手手機交易市場 瀏覽:518
廣發銀行交易失敗什麼原因 瀏覽:444