
全文檢索大致分兩個過程,索引建立 (Indexing) 和搜索索引 (Search) 。算法
- 索引建立:將現實世界中全部的結構化和非結構化數據提取信息,建立索引的過程。
- 搜索索引:就是獲得用戶的查詢請求,搜索建立的索引,而後返回結果的過程。
因而全文檢索就存在三個重要問題:oop
- 1. 索引裏面究竟存些什麼?(Index)
- 2. 如何建立索引?(Indexing)
- 3. 如何對索引進行搜索?(Search)
索引裏面究竟存些什麼
- 因爲從字符串到文件的映射是文件到字符串映射的反向過程,因而保存這種信息的索引稱爲反向索引 。

- 左邊保存的是一系列字符串,稱爲詞典 。
- 每一個字符串都指向包含此字符串的文檔(Document)鏈表,此文檔鏈表稱爲倒排表 (Posting List)。
查詢既包含字符串「lucene」又包含字符串「solr」的文檔,咱們只須要如下幾步:ui
- 1. 取出包含字符串「lucene」的文檔鏈表。
- 2. 取出包含字符串「solr」的文檔鏈表。
- 3. 經過合併鏈表,找出既包含「lucene」又包含「solr」的文件。

- 全文搜索相對於順序掃描的優點之一:一次索引,屢次使用。
如何建立索引
第一步:一些要索引的原文檔(Document)。
第二步:將原文檔傳給分詞器(Tokenizer)。
- 中文分詞器: IK Analyzer
-
1. 將文檔分紅一個一個單獨的單詞。spa
2. 去除標點符號。3d
3. 去除停詞(Stop word) 。blog
第三步:將獲得的詞元(Token)傳給語言處理組件(Linguistic Processor)。
- 1. 變爲小寫(Lowercase) 。
- 2. 將單詞縮減爲詞根形式,如「cars 」到「car 」等。這種操做稱爲:stemming 。
- 3. 將單詞轉變爲詞根形式,如「drove 」到「drive 」等。這種操做稱爲:lemmatization 。
第四步:將獲得的詞(Term)傳給索引組件(Indexer)。
- 1. 利用獲得的詞(Term)建立一個字典。
- 2. 對字典按字母順序進行排序。
- 3. 合併相同的詞(Term) 成爲文檔倒排(Posting List) 鏈表。

- Document Frequency 即文檔頻次,表示總共有多少文件包含此詞(Term)。
- Frequency 即詞頻率,表示此文件中包含了幾個此詞(Term)。
如何對索引進行搜索?
- 搜索主要分爲如下幾步:
-
第一步:用戶輸入查詢語句。
- 舉個例子,用戶輸入語句:lucene AND learned NOT hadoop。
-
第二步:對查詢語句進行詞法分析,語法分析,及語言處理。
-
第三步:搜索索引,獲得符合語法樹的文檔。
- 首先,在反向索引表中,分別找出包含lucene,learn,hadoop的文檔鏈表。
- 其次,對包含lucene,learn的鏈表進行合併操做,獲得既包含lucene又包含learn的文檔鏈表。
- 而後,將此鏈表與hadoop的文檔鏈表進行差操做,
- 去除包含hadoop的文檔,
- 從而獲得既包含lucene又包含learn並且不包含hadoop的文檔鏈表。
- 此文檔鏈表就是咱們要找的文檔。
-
第四步:根據獲得的文檔和查詢語句的相關性,對結果進行排序。
- 首先,一個文檔有不少詞(Term)組成
- 找出詞(Term) 對文檔的重要性:計算詞的權重(Term weight)
- 詞(Term)在文檔中出現的次數越多,說明此詞(Term)對該文檔越重要
- 有越多的文檔包含此詞(Term), 說明此詞(Term),重要性越低
-
判斷Term之間的關係從而獲得文檔相關性的過程,也即向量空間模型的算法(VSM)。