lucene 简单应用

一、创建lucene解决方案

    这里分成两部分,生成索引文件和从索引文件中搜索你想要的内容
   
二、创建索引文件
    
    下面是创建索引的一个简单例子:
   
//索引文件要保存的本地路径
string indexFileLocation = @"C:\Index";
Lucene.Net.Store.Directory dir =
    Lucene.Net.Store.FSDirectory.GetDirectory(indexFileLocation, true);

//创建一个语言分析器来处理文本
Lucene.Net.Analysis.Analyzer analyzer = new
Lucene.Net.Analysis.Standard.StandardAnalyzer();

//创建写索引的对象(包括三个参数,dir为索引的本地路径、analyzer语言分析器、true为创建新的索引)
Lucene.Net.Index.IndexWriter indexWriter = new
Lucene.Net.Index.IndexWriter(dir, analyzer, true);

//创建一个文档、并且添加一个域
Lucene.Net.Documents.Document doc = new
Lucene.Net.Documents.Document();

Lucene.Net.Documents.Field fldContent =
  new Lucene.Net.Documents.Field("content",
  "The quick brown fox jumps over the lazy dog",
  Lucene.Net.Documents.Field.Store.YES,
  Lucene.Net.Documents.Field.Index.TOKENIZED,
  Lucene.Net.Documents.Field.TermVector.YES);

doc.Add(fldContent);

//把文档添加到索引
indexWriter.AddDocument(doc);

//优化并关闭写索引类
indexWriter.Optimize();
indexWriter.Close();

上面的代码包括五个类,分别是:Directory、Analyzer、IndexWriter、Document、Field。
我们创建Document是告诉Lucene我们要保存索引的路径,Analyzer是用来分析文本,IndexWriter
是利用Directory和Analyzer来生成索引文件,接着创建一个Document对象和Field对象,Field的
名字是“content” 值是“The quick brown fox jumps over the lazy dog”,把Field添加到Document中,
把新创建的Document利用IndexWriter来生成索引,最后再优化、关闭IndexWriter,目前为止我们已经
成功创建了一个可以用来检索的全文索引,下面我们详细介绍一下例子中用到的类。

   Lucene.Net.Store.Directory - Directory是一个抽象类,在Lucene.net中有两个类实现它,分别
   是:FSDirectory使用本地目录来存储索引,RAMDirectory使用内存来存储索引。我们可以继承Directory
   类来实现自定义的Directory对象来存储索引。
  
   Lucene.Net.Analysis.Analyzer - Analyzer是一个基类用来分词把文本分成单一的词,并且删除
   一些停用词(stop words)如:The、a、and等,我们一般采用StandarAnalyzer类来实现,可以自定义
   StandarAnalyzer的停用词数组,也可以采用默认的停用词数组,我们可以继承Analyzer来自定义实现
   ,例如:中文分词处理。
  
   Lucene.Net.Index.IndexWriter - IndexWriter承担负责通过Analyzer生成的索引保存到Directory,
   在创建索引的过程中,在目录下会生成一些文件,当我们把文档添加到IndexWriter时,IndexWriter
   将通过使用Analyzer分解词然后把保存到索引文件中,创建索引后,要对索引进行优化,InderWriter
   的参数中True是创建一个新索引,False是添加更多的文档到索引中。
  
   Lucene.Net.Documents.Document - Document通过IndexWriter来生成索引,可以理解为Document
   是你要获取的实体,Document可以理解为邮件、网页、PDF。
  
   Lucene.Net.Documents.Field - Document是由一系列Field来描述,Field有一个名字和值,每个
   Field的值包括我们要搜索的内容,Field.Store告诉IndexWriter我们要存储的Field的值到索引中,
   之后我们就能通过检索取得值并显示数据。
  
   Field.Index:值告诉IndexWriter怎么样去对Field做索引
   Field.Index.TOKENIZED:我们把字符串利用支持IndexWriter的Analyzer进行分词生成索引
   Field.Index.UNTOKENIZED:没有用Analyzer进行分词生成索引
   存储的值和索引的值的区别在于,存储的值的目的是为了从索引中获取值,索引的值是生成
   Field以便能被检索,
  
   三、检索索引中的内容
  
   我们来看一下下面的一个简单的搜索的例子
  
//保存索引的本地目录
string indexFileLocation = @"C:\Index";
Lucene.Net.Store.Directory dir =
    Lucene.Net.Store.FSDirectory.GetDirectory(indexFileLocation, true);

//创建一个IndexSearcher用来进行搜索
Lucene.Net.Search.IndexSearcher searcher = new
Lucene.Net.Search.IndexSearcher(dir);

//生成一个查询语句
Lucene.Net.Index.Term searchTerm =
  new Lucene.Net.Index.Term("content", "fox");
Lucene.Net.Search.Query query = new Lucene.Net.Search.TermQuery(searchTerm);

//执行查询语句
Lucene.Net.Search.Hits hits = searcher.Search(query);

//循环取得查询到的结果
for (int i = 0; i < hits.Length(); i++)
{
    Document doc = hits.Doc(i);
    string contentValue = doc.Get("content");

    Console.WriteLine(contentValue);

}

以上的代码中,我们定义了索引保存的路径,再一次使用了Directory类,这一次使用了IndexSearcher对象,
IndexSearcher执行所有的实际中用到的搜索,要使用IndexSearcher对象,并且得调用Query对象,
IndexSearcher对象利用Search方法调用Query对象来进行搜索,返回的结果是Hits对象,最终通过循环
获取Hits,我们能够获取到匹配到Query语句的Documents对象,有了Document,我们又取出Field的值。

看一下上面代码中用到的类:

    Lucene.Net.Search.IndexSearcher - 使用IndexSearcher执行所有的实际中用到的搜索,当完成
    执行一个查询的时候,IndexSearcher打开索引目录(只读)
   
    Lucene.Net.Index.Term - Term是搜索的最基本数据,Term是由两部分组成,我们要搜索的名字和
    对应的值。
   
    Lucene.Net.Search.Query - 一个类通过IndexSearcher执行来提供结果数据,Query是一个抽象类,
    在上面的示例代码中,我们使用了TermQuery对象生成一个查询语句,还有很多其它方法来创建查询
    语句,除了TermQuery,还有BooleanQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、
    RangeQuery、FilteredQuery、SpanQuery。
   
    Lucene.Net.Search.Hits - 搜索返回的一系列文档,Hits对象能循环获取,负责从搜索中获取文档
    对于大量的索引,不推荐用循环获取所以的搜索结果,最初Hits不要加载所有的文档,只加载一部分
    文档,获取到Hits对象后,就可以利用Doc方法从单一的Hits中返回关联的文档。