搜尋之正排索引

2021-08-07 03:24:31 字數 2404 閱讀 2574

正排索引,也叫前向索引,和倒排索引(也叫反向索引)是相對的,正排索引相對倒排來說簡單多了,第二篇文章的時候有下面兩個**(表1和表2)

這個是表1

文件編號

文件內容

1這是乙個go語言實現的搜尋引擎

2php是世界上最好的語言

3linux是c語言和組合語言實現的

4谷歌是乙個世界上最好的搜尋引擎公司

這個是表2

文件編號go1

語言1,2,3

實現1,3

搜尋引擎

1,4php2世界

2,4最好

2,4彙編3公司

4 我們之前一直在說作為倒排索引的表2,對於表1,我們認為是資料的詳情(detail)資訊,最後用來做資料內容展示的,如果是放在乙個只支援全文搜尋的搜尋引擎中的話,那確實表1只是用來做最後的資料展示,但是如果我們的搜尋引擎還想要一些複雜的功能,那麼表1就是乙個正排索引,如果我們的搜尋引擎同時支援倒排索引和正排索引,我們可以簡單的認為這是乙個資料庫系統(當然,和真正的資料庫還差得遠啊)。

很明顯,如果倒排索引滿足不了搜尋要求的時候,就需要引入正排索引,比如乙個電商的搜尋引擎,那麼正排索引就是必須的了,假如我們有以下幾個商品需要上架:

商品編號

商品標題

發布時間

**品牌

10001

錘子手機t9

2026-06-06

5000

錘子10002

小公尺手機10

2020-02-02

1999

小公尺10003

華為手機p20

2022-12-12

3999華為

搜尋的時候我們可能需要搜尋**在乙個區間的手機,那麼僅僅用全文倒排索引就比較難完成任務了,而且我們在使用電商的搜尋引擎的時候,經常會在搜尋結果的上方看到一些彙總的資訊【比如品牌,型號,**彙總】,這一部分的東西也是通過正排索引來實現的,像下面這個圖

實現正排索引有兩種方式:

這是第一種實現方式,彙總操作大家可以自己想想怎麼做,也能做,就是麻煩點。這種實現方式有下面幾個特點

除了上面那個,還有一種實現方式,就是通過乙個陣列來實現,陣列的下表就是文件編號(docid,不是商品編號,商品編號是主鍵),由於在搜尋引擎中,docid是自增的,而且不會進行刪除,所以也是唯一的,正好可以和乙個一維陣列的下標對上,所以可以用乙個陣列來儲存正排索引,就像下面這個**,分別表示**和品牌建立的正排索引,其實就是把錶1的資料拆開來進行儲存了而已。(為了節省空間,我把兩個寫在一起了)

docid

**docid品牌0

50000錘子

119991小公尺

239992華為

如果是彙總操作的話,和上述類似,在第二步遍歷結果集的時候順便就可以進行統計了,遍歷完了也就統計完了。

條條大路通羅馬,通過兩種不同的資料結構,最後得到了一樣的結果,第二方式有以下幾個特點

我的**裡面就是用的第二種方式,並且實現的時候是用mmap的方式在磁碟上實現的,如果記憶體夠大,可以全載入到記憶體提高檢索速度。

正排索引和倒排索引終於都說完了,這要是搜尋引擎最關鍵的資料結構了,其他所有的東西都是在這個基礎上發展起來的,我們已經有了正排和倒排索引的結構,那麼如果來構建乙個索引系統的,我是這麼來做的。

首先,我們需要定乙個規矩,所謂規矩就是我們的這個搜尋引擎哪些操作我支援,哪些操作我不支援,比如,我為了簡單,我就支援全文檢索,其他都不支援,那麼只需要好好的實現乙個倒排索引結構,那資料結構部分就設計的差不多了。而我在做這個搜尋引擎的時候,想實現的是下面這些個功能。

支援過濾操作,但是只支援整數型別(如果是浮點數根據保留的小數字數轉成整數)和日期型別的過濾,對於字串只提供檢索操作,不提供過濾操作。

對於過濾操作,支援大於,小於,等於,不等於,區間的過濾。

支援欄位的彙總。

不要外接資料庫系統進行資料詳情的展示。

既然是這麼來實現,那對於每個字段,他可能的型別就是

字段型別

行為備註舉例

完整匹配的字串

建立倒排,正排(正排只展示,不進行過濾操作)

主鍵,型號

建立倒排,正排(正排只展示,不進行過濾操作)

標題,描述

數字只建立正排

**,庫存

日期只建立正排

上架僅展示

只建立正排(正排只展示,不進行過濾操作)

商品詳情描述

這樣,我們實現的時候,首先實現乙個倒排索引(src/falconindex/segment/invert.go),然後實現乙個正排索引(src/falconindex/segment/profile.go),然後實現乙個欄位類(src/falconindex/segment/field.go)用來管理倒排和正排,那麼搜尋引擎最最基本的資料結構就ok了,對外來說倒排和正排是隱藏的,只有field類對外暴露,對檢索操作來說主要提供幾個介面方法:

搜尋引擎之正排與倒排索引

正排索引 正向索引 正排表是以文件的id為關鍵字,表中記錄文件中每個字的位置資訊,查詢時掃瞄表中每個文件中字的資訊直到找出所有包含查詢關鍵字的文件。正排表結構如圖1所示,這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易於維護 因為索引是基於文件建立的,若是有新的文件加入,直接為該文件建立乙...

elasticsearch 正排索引

倒排索引是我們所熟知的,正排索引是什麼,es還用到這個?當我們在很多資料中查詢某些內容時,倒排索引會乙個乙個的去遍歷完所有的倒排索引 表 然後再分組聚合,但是也許在前面的搜尋中以及找到了我們想要的結果只是倒排索引不知道,這樣顯示不是很好,為了應對這種情況,正排索引閃亮登場!正排索引 doc valu...

正排索引與倒排索引

什麼是正排索引 forward index 由key查詢實體的過程,是正排索引.什麼是倒排索引 inverted index 由item查詢key的過程,是倒排索引。倒排索引可以理解為map item,list id 能夠由查詢詞快速 時間複雜度o 1 找到包含這個查詢詞的檔案的資料結構。舉例 文件...