Posted by & filed under 搜索引擎秘籍.

Lucene是一款非常棒的搜索引擎,而Lucene.NET是Lucene的.NET版本,本入门文档将以Lucene.NET 3.03为例。

1、介绍一下创建索引过程的核心类

Directory类描述了Lucene索引存放的位置,它是一个抽象类,它的子类负责具体指定索引的存储路径。例如FSDirectory类是负责真实文件系统的存储。

IndexWriter是写索引的核心类,该类负责创建新索引或者打开已有的索引,以及向索引中添加、更新、删除被索引文档。该类不负责读取和搜索索引。

Analyzer是分词器的抽象类,分词器用来对文本信息进行分析处理,例如:输入的索引信息是Let me see.经过分词器分析后,得到三个单词Let、me、see。当然有很多分词规则,视实际需要而定。待索引文本需要经过分词器分析后,才能提交给IndexWriter类创建索引。

Document代表待索引的文档信息,可以通俗的理解为一条记录或一篇文章,而Field就是组成Document的最小单位。例如,需要保存10条记录的数据,每个记录包含title和content两个信息项,那么一条记录就是一个Document对象,而title和content就是两个Field。

2、介绍一下搜索索引过程的核心类

Searcher是一个用于搜索由 IndexWriter 类创建的索引,它是个抽象类,其中,IndexSearcher是最常用的派生类,该类最简单的实现是接收单个Query和int topN计数作为参数,返回一个TopDocs对象。

Query是查询子类,它是一个抽象类。搜索指定单词或词组涉及到在项中包装它们,将项添加到查询对象,将查询对象传递到Searcher的搜索方法。

Term是搜索功能的基本单元。与Field对象类似,Term对象包含一对字符串的键值对,即域名和单词。

TopDocs是一个简单的指针容器,其包含前Searcher对象返回的搜索结果,搜索结果包含在其ScoreDoc数组属性中,还包含这些文档的DocId和浮点型分数。

3、下面给出添加索引和搜索的简单示例

添加索引

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. // 索引文件所在目录
  2. private string INDEX_STORE_PATH = “D:\\SearchIndex”;
  3. private void CreateIndex()
  4. {
  5.     // 创建Directory对象,指向索引文件保存的目录
  6.     using (Directory indexDirectory = FSDirectory.Open(new System.IO.DirectoryInfo(INDEX_STORE_PATH)))
  7.     {
  8.         // 定义使用标准分词器
  9.         using (Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30))
  10.         {
  11.             // 检查目录是否已经存在
  12.             bool iscreate = !Lucene.Net.Index.IndexReader.IndexExists(indexDirectory);
  13.             // 使用之前创建的分析器、目录来创建索引写对象
  14.             using (IndexWriter writer = new IndexWriter(indexDirectory, analyzer, iscreate, IndexWriter.MaxFieldLength.UNLIMITED))
  15.             {
  16.                 // 向索引中添加文档
  17.                 AddDocument(writer, “Visual Studio”“Visual Studio 2013”);
  18.                 AddDocument(writer, “Microsoft Co.”“Microsoft will publish Visual Studio 2013”);
  19.                 // 优化索引
  20.                 writer.Optimize();
  21.             }
  22.         }
  23.     }
  24. }
  25. static void AddDocument(IndexWriter writer, string title, string content)
  26. {
  27.     // 创建文档对象
  28.     Document document = new Document();
  29.     // 给文档添加Field对象
  30.     document.Add(new Field(“title”, title, Field.Store.YES, Field.Index.ANALYZED));
  31.     document.Add(new Field(“content”, content, Field.Store.YES, Field.Index.ANALYZED));
  32.     // 将文档添加到writer对象中,由其后代码创建索引
  33.     writer.AddDocument(document);
  34. }

搜索索引

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public void Search()
  2. {
  3.     // 创建Directory对象,指向索引文件保存的目录
  4.     using (Directory indexDirectory = FSDirectory.Open(new System.IO.DirectoryInfo(INDEX_STORE_PATH)))
  5.     {
  6.         // 创建标准分词器
  7.         using (Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30))
  8.         {
  9.             // 创建索引搜索对象
  10.             using (IndexSearcher searcher = new IndexSearcher(indexDirectory, true))
  11.             {
  12.                 // 查找title中包含visual单词的文档
  13.                 Term t = new Term(“title”“visual”);
  14.                 Query query = new TermQuery(t);
  15.                 TopDocs docs = searcher.Search(query, 10);
  16.                 Console.WriteLine(docs.TotalHits);
  17.                 // 查找content中包含studio单词的文档
  18.                 t = new Term(“content”“studio”);
  19.                 docs = searcher.Search(new TermQuery(t), 10);
  20.                 Console.WriteLine(docs.TotalHits);
  21.             }
  22.         }
  23.     }
  24. }

 

参考:《Lucene in Action》