Touch Lucene.net

最近Julia在接手lucene.net的活,让我帮看看,于是我就查了查。之前看到过Birdshoverlucene.net 系列,不过只是走马观花看了一下,现在来好好研究研究了。

1. what is Lucene?

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。

目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。

搜索应用程序和 Lucene 之间的关系

fig001

Lucene.net是Lucene的.net版本。

2. What can lucene do?

简单的说,lucene主要做两件事:

  1. 创建索引
  2. 通过索引进行查询

lucene在全文检索上,效率是很高的。

Apache Lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucene提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自己需要自订其功能。

3. How does lucene work?

第一,创建索引。

本例的数据源是数据库。

code
public static void Build(string conString, string indexLocation)
{
    Analyzer analyzer = new StandardAnalyzer();
    IndexWriter writer = new IndexWriter(indexLocation, analyzer);

    SqlDataReader sdr = DbHelper.ExecuteReader(conString, CommandType.Text, "select top 100 id,title,content from article");
    while (sdr.Read())
    {
       Document doc = new Document();//创建记录对象
        doc.Add(new Field("id", sdr["id"].ToString(), Field.Store.YES, Field.Index.NO));//存储,不索引
        doc.Add(new Field("title", sdr["title"].ToString(), Field.Store.NO, Field.Index.TOKENIZED));//不存储,分词索引
        doc.Add(new Field("content", sdr["content"].ToString(), Field.Store.NO, Field.Index.TOKENIZED));//不存储,分词索引
        writer.AddDocument(doc);//加载记录
    }
    sdr.Close();

    writer.Optimize();
    writer.Close();
}

首先创建一个分析器,这里是标准分析器(以后会说到其他的分析器)。然后创建一个基于这个分析器的写索引对象。通过数据库DbHelper类,读取数据库中Article表里的记录,这里我们读前一百条。(这里我就直接用ADO.NET(企业库DAAB),并没有用Entities。) 每读到一条记录,就创建一个document对象,并向对象中添加Field。注意到,Field在构造的时候,后面两个参数分别指定了是否存储和是否索引,这是关键。从与数据库的映射关系很容易联想到,document就相当于记录,field就相当于字段。最后把创建好的“记录”添加到writer里面去。

最后做Optimize工作,并关闭对象释放资源。

这就是一个简单的创建索引的例子。

明天我会说到如何基于索引进行检索。

那么今天就到这里了~~~

posted @ 2009-07-21 23:44  Scott Xu //南方小鬼  阅读(588)  评论(0编辑  收藏  举报