LUCENE建立索引

索引是現代搜索引擎的核心,創建索引的過程就是把源數據處理成很是方便查詢的索引文件的過程。爲何索引這麼重要呢,試想你如今要在大量的文檔中搜索含有某個關鍵詞的文檔,那麼若是不創建索引的話你就須要把這些文檔順序的讀入內存,而後檢查這個文章中是否是含有要查找的關鍵詞,這樣的話就會耗費很是多的時間,想一想搜索引擎但是在毫秒級的時間內查找出要搜索的結果的。這就是因爲創建了索引的緣由,你能夠把索引想象成這樣一種數據結構,他可以使你快速的隨機訪問存儲在索引中的關鍵詞,進而找到該關鍵詞所關聯的文檔。Lucene 採用的是一種稱爲反向索引(inverted index)的機制。反向索引就是說咱們維護了一個詞 / 短語表,對於這個表中的每一個詞 / 短語,都有一個鏈表描述了有哪些文檔包含了這個詞 / 短語。這樣在用戶輸入查詢條件的時候,就能很是快的獲得搜索結果。咱們將在本系列文章的第二部分詳細介紹 Lucene 的索引機制,因爲 Lucene 提供了簡單易用的 API,因此即便讀者剛開始對全文本進行索引的機制並不太瞭解,也能夠很是容易的使用 Lucene 對你的文檔實現索引。

對文檔創建好索引後,就能夠在這些索引上面進行搜索了。搜索引擎首先會對搜索的關鍵詞進行解析,而後再在創建好的索引上面進行查找,最終返回和用戶輸入的關鍵詞相關聯的文檔。 數據庫

創建索引索引: 數據結構

爲了對文檔進行索引,Lucene 提供了五個基礎的類,他們分別是 Document, Field, IndexWriter, Analyzer, Directory。下面咱們分別介紹一下這五個類的用途: 函數

Document 搜索引擎

Document 是用來描述文檔的,這裏的文檔能夠指一個 HTML 頁面,一封電子郵件,或者是一個文本文件。一個 Document 對象由多個 Field 對象組成的。能夠把一個 Document 對象想象成數據庫中的一個記錄,而每一個 Field 對象就是記錄的一個字段。 spa

Field 對象

Field 對象是用來描述一個文檔的某個屬性的,好比一封電子郵件的標題和內容能夠用兩個 Field 對象分別描述。 索引

Analyzer 內存

在一個文檔被索引以前,首先須要對文檔內容進行分詞處理,這部分工做就是由 Analyzer 來作的。Analyzer 類是一個抽象類,它有多個實現。針對不一樣的語言和應用須要選擇適合的 Analyzer。Analyzer 把分詞後的內容交給 IndexWriter 來創建索引。 文檔

IndexWriter string

IndexWriter 是 Lucene 用來建立索引的一個核心的類,他的做用是把一個個的 Document 對象加到索引中來。

Directory

這個類表明了 Lucene 的索引的存儲的位置,這是一個抽象類,它目前有兩個實現,第一個是 FSDirectory,它表示一個存儲在文件系統中的索引的位置。第二個是 RAMDirectory,它表示一個存儲在內存當中的索引的位置。

         //索引文件的存放位置
            string INDEX_FILE_PATH = "C:\\wwwroot\\Test\\" + DateTime.Now.ToString("yyyyMMdd") + "_" + DateTime.Now.Ticks.ToString();
            //實例化一個索引器(須要三個參數)
            //一、path  索引器的存放路徑
            //二、Analyzer  一個分析器
            //三、是否在索引目錄下從新建立索引文件,false的話在原有文件上疊加
            IndexWriter indexwrite = new IndexWriter(INDEX_FILE_PATH, new StandAnalyzer(), true);
                    //Document能夠看作是數據庫中一條記錄,field能夠看作爲一個字段
                    Document doc = new Document();
                    //向doc容器裏添加一個field,"pkid"爲field的名字,第二個參數爲其值,第三個參數爲是否存儲,第四個參數爲是否索引
                    doc.Add(new Field("pkid", 「數據1」, Field.Store.YES, Field.Index.UN_TOKENIZED));//存儲該field,不建立索引
                    doc.Add(new Field("title",「數據2」, Field.Store.YES, Field.Index.UN_TOKENIZED));//存儲該field,不建立索引
                    doc.Add(new Field("summary", "數據1",Field.Store.YES, Field.Index.UN_TOKENIZED));//存儲該field,建立索引
                    indexwrite.AddDocument(doc);


                    indexwrite.Optimize();
                    indexwrite.Close();//建立索引成功,關閉索引

         

     咱們注意到類 IndexWriter 的構造函數須要三個參數,第一個參數指定了所建立的索引要存放的位置,他能夠是一個 File 對象,也能夠是一個 FSDirectory 對象或者 RAMDirectory 對象。第二個參數指定了 Analyzer 類的一個實現,也就是指定這個索引是用哪一個分詞器對文擋內容進行分詞。第三個參數是一個布爾型的變量,若是爲 true 的話就表明建立一個新的索引,爲 false 的話就表明在原來索引的基礎上進行操做。接着程序遍歷了目錄下面的全部文本文檔,併爲每個文本文檔建立了一個 Document 對象。而後把文本文檔的兩個屬性:路徑和內容加入到了兩個 Field 對象中,接着在把這兩個 Field 對象加入到 Document 對象中,最後把這個文檔用 IndexWriter 類的 add 方法加入到索引中去。這樣咱們便完成了索引的建立。接下來咱們進入在創建好的索引上進行搜索的部分。

相關文章
相關標籤/搜索