公號:碼農充電站pro
主頁:https://codeshellme.github.io
1,倒排索引
倒排索引是一種數據結構,經常用在搜索引擎的實現中,用於快速找到某個單詞所在的文檔。
倒排索引會記錄一個單詞詞典(Term Dictionary)和一個倒排列表:
- 單詞詞典:包含了所有文檔包含的所有 Term。
- 倒排列表:由一系列的倒排索引項組成,每個倒排索引項包含 4 項內容,分別是:
- 文檔 ID
- 詞頻 TF:Term 在文檔中出現的次數,用於相關性評分。
- 位置 Position:Term 在文檔中出現的位置,用於語句搜索。
- 偏移 Offset:記錄單詞的開始結束位置,用於實現高亮顯示。
假設我們有 3 篇文檔:
文檔 ID | 文檔內容 |
---|---|
1 | hello world |
2 | hello Java |
3 | hello elasticsearch |
上面表格記錄的是一種正向關係,叫做正排索引。
倒排索引記錄的是一種反向關係,如下:
Term | 文檔 ID | 詞頻 TF | Position | Offset |
---|---|---|---|---|
hello | 1 | 1 | 0 | <0, 5> |
hello | 2 | 1 | 0 | <0, 5> |
hello | 3 | 1 | 0 | <0, 5> |
world | 1 | 1 | 1 | <6, 5> |
Java | 2 | 1 | 1 | <6, 4> |
elasticsearch | 3 | 1 | 1 | <6, 19> |
ES 默認會對所有文檔的所有字段建立倒排索引;也可以通過設置不對某些字段建立倒排索引,優點是節省空間,缺點是這些字段的內容無法被搜索。
2,搜索相關性
搜索相關性用於描述文檔與搜索字符串的匹配程度(ES 會計算出一個評分),目的是爲文檔進行排序,從而將最符合用戶需求的文檔排在前面。
搜索相關性算法有 TF-IDF 算法和 BM25 算法。
文章 《樸素貝葉斯分類-實戰篇》中介紹到了 TF-IDF 算法,可作爲參考。
BM25 與 TF-IDF 的比較:
當 TF 無限增加的時候,BM25 算分會趨向於一個數值,而不是(像 TF-IDF 一樣)無限增長。
在 ES 5 之前,默認使用的是 TF-IDF 算法;在 ES 5 之後,默認使用的是 BM 25 算法。
3,一個搜索過程
下圖展示了一個搜索過程:
當用戶向搜索引擎發送一個搜索請求的時候,搜索引擎經過了以下步驟:
- 分詞器對搜索字符串進行分詞處理。
- 在倒排索引表中查到匹配的文檔。
- 對每個匹配的文檔進行相關性評分。
- 根據相關性評分對文檔進行排序。
- 將排好序的文檔返回給用戶。