正向索引(forward index),反向索引(inverted index)更熟悉的名字是倒排索引。
在搜索引擎中每個文件都對應一個文件ID,文件內容被表示為一系列關鍵詞的集合(實際上在搜索引擎索引庫中,關鍵詞也已經轉換為關鍵詞ID)。例如“文檔1”經過分詞,提取了20個關鍵詞,每個關鍵詞都會記錄它在文檔中的出現次數和出現位置。
得到正向索引的結構如下:
“文檔1”的ID > 單詞1:出現次數,出現位置列表;單詞2:出現次數,出現位置列表;…………。
“文檔2”的ID > 此文檔出現的關鍵詞列表。
一般是通過key,去找value。
當用戶在主頁上搜索關鍵詞“華為手機”時,假設只存在正向索引(forward index),那么就需要掃描索引庫中的所有文檔,找出所有包含關鍵詞“華為手機”的文檔,再根據打分模型進行打分,排出名次后呈現給用戶。因為互聯網上收錄在搜索引擎中的文檔的數目是個天文數字,這樣的索引結構根本無法滿足實時返回排名結果的要求。
注意這個打分模型,是可以自己設置調節的,在倒排索引當中,也有相應的打分模型,打分模型的打分決定了這些文檔的排列先后順序 ,也就是在那個鏈表中的先后位置,
所以,搜索引擎會將正向索引重新構建為倒排索引,即把文件ID對應到關鍵詞的映射轉換為關鍵詞到文件ID的映射,每個關鍵詞都對應着一系列的文件,這些文件中都出現這個關鍵詞。
得到倒排索引的結構如下:
“關鍵詞1”:“文檔1”的ID,“文檔2”的ID,…………。
“關鍵詞2”:帶有此關鍵詞的文檔ID列表。
從詞的關鍵字,去找文檔。
單詞——文檔矩陣
單詞-文檔矩陣是表達兩者之間所具有的一種包含關系的概念模型,圖1展示了其含義。圖3-1的每列代表一個文檔,每行代表一個單詞,打對勾的位置代表包含關系。
從縱向即文檔這個維度來看,每列代表文檔包含了哪些單詞,比如文檔1包含了詞匯1和詞匯4,而不包含其它單詞。從橫向即單詞這個維度來看,每行代表了哪些文檔包含了某個單詞。比如對於詞匯1來說,文檔1和文檔4中出現過單詞1,而其它文檔不包含詞匯1。矩陣中其它的行列也可作此種解讀。
搜索引擎的索引其實就是實現“單詞-文檔矩陣”的具體數據結構。可以有不同的方式來實現上述概念模型,比如“倒排索引”、“簽名文件”、“后綴樹”等方式。但是各項實驗數據表明,“倒排索引”是實現單詞到文檔映射關系的最佳實現方式,所以本博文主要介紹“倒排索引”的技術細節。
倒排索引(Inverted Index):倒排索引是實現“單詞-文檔矩陣”的一種具體存儲形式,通過倒排索引,可以根據單詞快速獲取包含這個單詞的文檔列表。倒排索引主要由兩個部分組成:“單詞詞典”和“倒排文件”。
單詞詞典(Lexicon):搜索引擎的通常索引單位是單詞,單詞詞典是由文檔集合中出現過的所有單詞構成的字符串集合,單詞詞典內每條索引項記載單詞本身的一些信息以及指向“倒排列表”的指針。
倒排列表(PostingList):倒排列表記載了出現過某個單詞的所有文檔的文檔列表及單詞在該文檔中出現的位置信息,每條記錄稱為一個倒排項(Posting)。根據倒排列表,即可獲知哪些文檔包含某個單詞。
倒排文件(Inverted File):所有單詞的倒排列表往往順序地存儲在磁盤的某個文件里,這個文件即被稱之為倒排文件,倒排文件是存儲倒排索引的物理文件。
關於這些概念之間的關系,通過圖2可以比較清晰的看出來。
問題:ES 倒排索引,內部的鏈表以什么排序
回答: 根據打分模型的打分進行排序。每條記錄有一個score 參數,帶有很多小數的double類型,可以看到具體的打分,影響這個打分的有單詞在這個文檔中出現的位置,出現的頻率次數等眾多參數。