Touch Lucene.net
最近Julia在接手lucene.net的活,让我帮看看,于是我就查了查。之前看到过Birdshover的lucene.net 系列,不过只是走马观花看了一下,现在来好好研究研究了。
1. what is Lucene?
Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。
目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。
搜索应用程序和 Lucene 之间的关系
Lucene.net是Lucene的.net版本。
2. What can lucene do?
简单的说,lucene主要做两件事:
- 创建索引
- 通过索引进行查询
lucene在全文检索上,效率是很高的。
Apache Lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucene提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自己需要自订其功能。
3. How does lucene work?
第一,创建索引。
本例的数据源是数据库。
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工作,并关闭对象释放资源。
这就是一个简单的创建索引的例子。
明天我会说到如何基于索引进行检索。
那么今天就到这里了~~~