Lucene.net 系列一

 
 
本文介紹了什麼是Lucene,Lucene能做什麼.如何從一個文件夾下的所有txt文件中查找特定的詞?本文將圍繞該個實例介紹了lucene.net的索引的建立以及如何針對索引進行搜索.最後還將給出源代碼供大家學習.
What’s Lucene
Lucene是一個信息檢索的函數庫(Library),利用它你可以爲你的應用加上索引和搜索的功能.
Lucene的使用者不需要深入瞭解有關全文檢索的知識,僅僅學會使用庫中的一個類,你就爲你的應用實現全文檢索的功能.
不過千萬別以爲Lucene是一個象google那樣的搜索引擎,Lucene甚至不是一個應用程序,它僅僅是一個工具,一個Library.你也可以把它理解爲一個將索引,搜索功能封裝的很好的一套簡單易用的API.利用這套API你可以做很多有關搜索的事情,而且很方便.
What Can Lucene Do
Lucene可以對任何的數據做索引和搜索. Lucene不管數據源是什麼格式,只要它能被轉化爲文字的形式,就可以被Lucene所分析利用.也就是說不管是MS word, Html ,pdf還是其他什麼形式的文件只要你可以從中抽取出文字形式的內容就可以被Lucene所用.你就可以用Lucene對它們進行索引以及搜索.
How To Use Lucene --- A Simple Example
示例介紹:
爲作爲輸入參數的文件夾下的所有txt類型的文件做索引,做好的索引文件放入index文件夾.
然後在索引的基礎上對文件進行全文搜索.
1.       建立索引
IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), true);
IndexDocs(writer, new System.IO.FileInfo(args[0]));               
writer.Optimize();
writer.Close();
IndexWriter是對索引進行寫操作的一個類,利用它可以創建一個索引對象然後往其中添加文件.需要注意它並不是唯一可以修改索引的類.在索引建好後利用其他類還可以對其進行修改.
構造函數第一個參數是建立的索引所要放的文件夾的名字.第二個參數是一個分析對象,主要用於從文本中抽取那些需要建立索引的內容,把不需要參與建索引的文本內容去掉.比如去掉一些a the之類的常用詞,還有決定是否大小寫敏感.不同的選項通過指定不同的分析對象控制.第三個參數用於確定是否覆蓋原有索引的.
第二步就是利用這個writer往索引中添加文件.具體後面再說.
第三步進行優化.
第四步關閉writer.
下面具體看看第二步:
public static void IndexDirectory(IndexWriter writer, FileInfo file)
         {
              if (Directory.Exists(file.FullName))
              {
                   String[] files = Directory.GetFileSystemEntries(file.FullName);
                   // an IO error could occur
                   if (files != null)
                   {
                       for (int i = 0; i < files.Length; i++)
                       {
                            IndexDirectory(writer, new FileInfo(files[i])); //這裏是一個遞歸
                       }
                   }
              }
              else if (file.Extension == ".txt")
              {
                   IndexFile(file, writer);
              }
         }



         private static void IndexFile(FileInfo file, IndexWriter writer)
         {
              Console.Out.WriteLine("adding " + file);
              try
              {
                   Document doc = new Document();                   
                   doc.Add(Field.Keyword("filename", file.FullName));

                   doc.Add(Field.Text("contents", new StreamReader(file.FullName)));

                   writer.AddDocument(doc);
              }
              
              catch (FileNotFoundException fnfe)
              {
                   
              }
     }
主要就是兩個函數一個用於處理文件夾(不是爲文件夾建立索引),一個用於真正爲文件建立索引.
因此主要集中看一下IndexFile這個方法.首先建立Document對象,然後爲Document對象添加一些屬性Field.你可以把Document對象看成是虛擬文件,將來將從此獲取信息.而Field則看成是描述此虛擬文件的元數據(metadata).
其中Field包括四個類型:
Keywork
該類型的數據將不被分析,而會被索引並保存保存在索引中.
UnIndexed 該類型的數據不會被分析也不會被索引,但是會保存在索引.
UnStored 和UnIndexed剛好相反,被分析被索引,但是不被保存.
Text 和UnStrored類似.如果值的類型爲string還會被保存.如果值的類型爲Reader就不會被保存和UnStored一樣.
最後將每一個Document添加到索引當中.需要注意的是索引不僅可以建立在文件系統上,也可以建立在內存中.
例如IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), true);
在第一個參數不是指定文件夾的名字而是使用Directory對象,並使用它的子類RAMDirectory,就可以將索引建立在內存當中.
2.       對索引進行搜索
IndexSearcher indexSearcher= new IndexSearcher(indexDir);
Query query
= QueryParser.Parse(queryString, "contents",new StandardAnalyzer());
Hits hits
= indexSearcher.Search(query);
第一步利用IndexSearcher打開索引文件用於後面搜索,其中的參數是索引文件的路徑.
第二步使用QueryParser將可讀性較好的查詢語句(比如查詢的詞lucene ,以及一些高級方式lucene AND .net)轉化爲Lucene內部使用的查詢對象.
第三步執行搜索.並將結果返回到hits集合.需要注意的是Lucene並不是一次將所有的結果放入hits中而是採取一次放一部分的方式.出於空間考慮.
至此,本文演示瞭如何從一個文件夾下的所有txt文件中查找特定的詞。並圍繞該個實例介紹了lucene.net的索引的建立以及如何針對索引進行搜索.最後給出源代碼供大家學習.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章