Lucene.Net系列一 ---simple example - -
What’s Lucene Lucene的使用者不需要深入了解有關全文檢索的知識,僅僅學會使用庫中的一個類,你就為你的應用實現(xiàn)全文檢索的功能. 不過千萬別以為Lucene是一個象google那樣的搜索引擎,Lucene甚至不是一個應用程序,它僅僅是一個工具,一個Library.你也可以把它理解為一個將索引,搜索功能封裝的很好的一套簡單易用的API.利用這套API你可以做很多有關搜索的事情,而且很方便. What Can Lucene Do Lucene可以對任何的數(shù)據(jù)做索引和搜索. Lucene不管數(shù)據(jù)源是什么格式,只要它能被轉化為文字的形式,就可以被Lucene所分析利用.也就是說不管是MS word, Html ,pdf還是其他什么形式的文件只要你可以從中抽取出文字形式的內容就可以被Lucene所用.你就可以用Lucene對它們進行索引以及搜索. How To Use Lucene --- A Simple Example 為作為輸入?yún)?shù)的文件夾下的所有txt類型的文件做索引,做好的索引文件放入index文件夾. 然后在索引的基礎上對文件進行全文搜索. 1. 建立索引IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), true); IndexDocs(writer, new System.IO.FileInfo(args[0])); writer.Optimize(); writer.Close(); IndexWriter是對索引進行寫操作的一個類,利用它可以創(chuàng)建一個索引對象然后往其中添加文件.需要注意它并不是唯一可以修改索引的類.在索引建好后利用其他類還可以對其進行修改. 構造函數(shù)第一個參數(shù)是建立的索引所要放的文件夾的名字.第二個參數(shù)是一個分析對象,主要用于從文本中抽取那些需要建立索引的內容,把不需要參與建索引的文本內容去掉.比如去掉一些a the之類的常用詞,還有決定是否大小寫敏感.不同的選項通過指定不同的分析對象控制.第三個參數(shù)用于確定是否覆蓋原有索引的. 第二步就是利用這個writer往索引中添加文件.具體后面再說. 第三步進行優(yōu)化. 第四步關閉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則看成是描述此虛擬文件的元數(shù)據(jù)(metadata). 其中Field包括四個類型:
最后將每一個Document添加到索引當中. 需要注意的是索引不僅可以建立在文件系統(tǒng)上,也可以建立在內存中. 例如 IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), true); 在第一個參數(shù)不是指定文件夾的名字而是使用Directory對象,并使用它的子類RAMDirectory,就可以將索引建立在內存當中.
2. 對索引進行搜索 IndexSearcher indexSearcher= new IndexSearcher(indexDir); Query query = QueryParser.Parse(queryString, "contents",new StandardAnalyzer()); Hits hits = indexSearcher.Search(query); 第一步利用IndexSearcher打開索引文件用于后面搜索,其中的參數(shù)是索引文件的路徑. 第二步使用QueryParser將可讀性較好的查詢語句(比如查詢的詞lucene ,以及一些高級方式lucene AND .net)轉化為Lucene內部使用的查詢對象. 第三步執(zhí)行搜索.并將結果返回到hits集合.需要注意的是Lucene并不是一次將所有的結果放入hits中而是采取一次放一部分的方式.出于空間考慮. 至此,本文演示了如何從一個文件夾下的所有txt文件中查找特定的詞。并圍繞該個實例介紹了lucene.net的索引的建立以及如何針對索引進行搜索.最后給出源代碼供大家學習. |
|