Lucene 原理分析之-全文檢索的通常過程-筆記

  • 描述了全文檢索的通常過程

全文檢索大致分兩個過程,索引建立 (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。
    • 第二步:對查詢語句進行詞法分析,語法分析,及語言處理。

      • 1. 詞法分析主要用來識別單詞和關鍵字。
      • 2. 語法分析主要是根據查詢語句的語法規則來造成一棵語法樹。
        • 如上述例子,lucene AND learned NOT hadoop造成的語法樹以下:
      • 3. 語言處理同索引過程當中的語言處理幾乎相同。排序

        • 如learned變成learn等。索引

    • 第三步:搜索索引,獲得符合語法樹的文檔。

      • 首先,在反向索引表中,分別找出包含lucene,learn,hadoop的文檔鏈表。
      • 其次,對包含lucene,learn的鏈表進行合併操做,獲得既包含lucene又包含learn的文檔鏈表。
      • 而後,將此鏈表與hadoop的文檔鏈表進行差操做,
        • 去除包含hadoop的文檔,
        • 從而獲得既包含lucene又包含learn並且不包含hadoop的文檔鏈表
      • 此文檔鏈表就是咱們要找的文檔。
    • 第四步:根據獲得的文檔和查詢語句的相關性,對結果進行排序。

      • 首先,一個文檔有不少詞(Term)組成 
      • 找出詞(Term) 對文檔的重要性:計算詞的權重(Term weight) 
        • 詞(Term)在文檔中出現的次數越多,說明此詞(Term)對該文檔越重要
        • 越多的文檔包含此詞(Term), 說明此詞(Term),重要性越低
      • 判斷Term之間的關係從而獲得文檔相關性的過程,也即向量空間模型的算法(VSM)

        • 咱們把全部此文檔中詞(term)的權重(term weight) 看做一個向量。hadoop

          • Document = {term1, term2, …… ,term N}文檔

            Document Vector = {weight1, weight2, …… ,weight N}

        • 查詢語句看做一個簡單的文檔,也用向量來表示

          • Query = {term1, term 2, …… , term N}

            Query Vector = {weight1, weight2, …… , weight N}

        • ​​​​​​​

相關文章
相關標籤/搜索