Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net

原文:Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net

1、引用Lucene.Net类库

找到Lucene.Net的源代码,在“C#\src\Lucene.Net”目录。打开Visual Studio,我的版本是2008,而Lucene.Net默认的是2005。先创建一个项目,简单起见,创建一个C#控制台程序。


图 1.1

然后添加Lucene.Net进项目,如图 1.2 - 1.3。


图 1.2


图 1.3

这个过程要进行一个VS2005到2008的转换。添加后,解决方案就有Lucene.Net项目了,如图1.4。


图 1.4

然后把Lucene.Net引入TestLucene项目。如图1.5 -1.6:


图1.5


图1.6

点确定后就可以了。这时候,就可以在TestLucene项目中使用Lucene.Net的API了。

2、简单示例
对Lucene.Net的操作分为建立索引,和搜索两部分。

2.1 建立索引

通过代码 2.1.1,就可以简单地建立一个索引了。代码 2.1.1将在应用程序目录下建立一个IndexDirectory目录,并在目录下创建索引文件。

代码 2.1.1

 

Code
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5
 6namespace TestLucene
 7{
 8    using Lucene.Net.Index;
 9    using Lucene.Net.Store;
10    using Lucene.Net.Analysis;
11    using Lucene.Net.Analysis.Standard;
12    using Lucene.Net.Documents;
13
14    class Program
15    {
16        static void Main(string[] args)
17        {
18            Analyzer analyzer = new StandardAnalyzer();
19            IndexWriter writer = new IndexWriter("IndexDirectory", analyzer, true);
20            AddDocument(writer, "SQL Server 2008 的发布", "SQL Server 2008 的新特性");
21            AddDocument(writer, "ASP.Net MVC框架配置与分析", "而今,微软推出了新的MVC开发框架,也就是Microsoft ASP.NET 3.5 Extensions");
22            writer.Optimize();
23            writer.Close();
24        }
25
26        static void AddDocument(IndexWriter writer, string title, string content)
27        {
28            Document document = new Document();
29            document.Add(new Field("title", title, Field.Store.YES, Field.Index.TOKENIZED));
30            document.Add(new Field("content", content, Field.Store.YES, Field.Index.TOKENIZED));
31            writer.AddDocument(document);
32        }
33    }
34}
35

 

2.2 搜索索引

代码2.2.1就可以搜索刚才建立的索引。

 

代码 2.2.1

 

Code
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5
 6namespace TestLucene
 7{
 8    using Lucene.Net.Index;
 9    using Lucene.Net.Store;
10    using Lucene.Net.Analysis;
11    using Lucene.Net.Analysis.Standard;
12    using Lucene.Net.Documents;
13    using Lucene.Net.Search;
14    using Lucene.Net.QueryParsers;
15
16    class Program
17    {
18        static void Main(string[] args)
19        {
20            Analyzer analyzer = new StandardAnalyzer();
21            //IndexWriter writer = new IndexWriter("IndexDirectory", analyzer, true);
22            //AddDocument(writer, "SQL Server 2008 的发布", "SQL Server 2008 的新特性");
23            //AddDocument(writer, "ASP.Net MVC框架配置与分析", "而今,微软推出了新的MVC开发框架,也就是Microsoft ASP.NET 3.5 Extensions");
24            //writer.Optimize();
25            //writer.Close();
26
27            IndexSearcher searcher = new IndexSearcher("IndexDirectory");
28            MultiFieldQueryParser parser = new MultiFieldQueryParser(new string[] { "title", "content" }, analyzer);
29            Query query = parser.Parse("sql");
30            Hits hits = searcher.Search(query);
31
32            for (int i = 0; i < hits.Length(); i++)
33            {
34                Document doc = hits.Doc(i);
35                Console.WriteLine(string.Format("title:{0} content:{1}", doc.Get("title"), doc.Get("content")));
36            }
37            searcher.Close();
38
39            Console.ReadKey();
40        }
41
42        //static void AddDocument(IndexWriter writer, string title, string content)
43        //{
44        //    Document document = new Document();
45        //    document.Add(new Field("title", title, Field.Store.YES, Field.Index.TOKENIZED));
46        //    document.Add(new Field("content", content, Field.Store.YES, Field.Index.TOKENIZED));
47        //    writer.AddDocument(document);
48        //}
49    }
50}
51

 

运行后输出:

 

title:SQL Server 2008 的发布 content:SQL Server 2008 的新特性

 

2.3 疑问

2.1,2.2小节介绍了最简单的建立和搜索索引的方式。虽然代码很短,使用也很简单,但是理解起来却不是太容易。

代码 2.1.1中,先是建立了一个分词器。什么是分词器?为什么要有分词器?分词器是怎么工作的?这些问题真让人头疼。接着建立一个IndexWriter的实例,这个类是负责创建索引的,有很多构造函数,这里使用的是其中的一个。三个参数分别是:索引建立到哪个目录,用什么分词器,还有就是是否创建。如果是否创建为false,那么就是以增量的方式来创建。再下来调用了AddDocument方法,在AddDocument方法中,先组织一个Docuement对象,然后把这个对象交给IndexWriter。然后再调用Optimize优化索引,最后关闭创建过程。这里面又有什么是Document,Document是怎么往存储器里写入的?Optimize方法能干什么?问题真多。

 

代码2.2.1则相对简单,先是创建IndexSearcher对象实例,并指定其搜索的目录,然后构造了一个查询Query,然后查出Hits,这样就得到想要的结果了。但是这个查询的过程是什么样的呢?这个Query代表什么?Hits是怎么得出来的?结果的顺序是怎么决定的?这些又是留下来的问题。

 

这么多问题,不能一次说完,欲知后事如何,下面一一道来。

时间: 2024-10-29 08:00:02

Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net的相关文章

Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了."哦,是!调整权重是能影响排序了,但是好像没办法来分析到底怎么调啊!".似乎是这样,现在需要把问题放大,加大索引的内容.到博客园新闻区,用zzk找了4篇内容包含"测试"的文章.代码变成 2.1.5 代码2.1.5  1using System;  2using System.Collections.Generic;  

Lucene.Net 2.3.1开发介绍 —— 简介

原文:Lucene.Net 2.3.1开发介绍 -- 简介          Lucene.Net是Lucene在dot net平台上的移植版本.它的功能与Lucene一样,都是用来提供一组API,让我们能快速开发自己的搜索引擎,当然,是全文搜索.它不是一个程序,拿到它并不能立刻运行,你必须自己实现逻辑过程.这是一个和.Net Framework一样的框架.Lucene是用Java写的,尔后衍生出Nutch,接着又衍生出Hadoop.这些可以说和Lucene没有内在联系,但是它们可以扩充Luce

Lucene.Net 2.3.1开发介绍 —— 三、索引(六)

原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(六) 2.2 Field的Boost 如果说Document的Boost是一条线,那么Field的Boost则是一个点.怎么理解这个点呢?设置Document的Boost会影响所有字段.在搜索的过程中,一般至少会搜索两个Field,比如同时搜索标题和内容.而Document的Boost将同时影响标题和内容的搜索得分,但是设置Field的Boost则不会有那么大的影响,Field的Boost只会影响一个点.那这个点有什么用呢?   现

Lucene.Net 2.3.1开发介绍 —— 二、分词(四)

原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词   简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyzer分词还算比较实用(见1.1.2小节).StandardAnalyzer为什么能满足我们的部分需求,而它又有哪些不足呢?看分词的好坏还是要从效果说起.简单的说,在中英文混合的情况下,StandardAnalyzer会把英文按空格拆,而中文则按单字拆.因为中文是按单字拆,所以对分词的准确性起到了干

Lucene.Net 2.3.1开发介绍 —— 三、索引(三)

原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果  索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是Field,接下来看看Field的各项设置都会有什么样的效果. 代码 3.1   Code 1/**//// <summary> 2/// 索引数据 3/// </summary> 4private void Index() 5{ 6    Analyzer analyzer = ne

Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)

原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索.搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此,搜索和索引一般是分开部署.简单地说,就是一个应用程序(桌面程序)来索引,一个WEB程序来实现搜索.当然,为了测试的时候简单,这里还是使用NUnit的方式运行.搜索讲完后,将会简单介绍单机搜索引擎如何部署. 4.1 搜索与什么有关 搜索与什么有关呢?即使没有看过前面的文章,那么现在来随便猜一猜. 首

Lucene.Net 2.3.1开发介绍 —— 三、索引(七)

原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter就是业务的封装.无论述Document,Field还是看不见的Segment,Term都是对数据存储逻辑的抽象,IndexWriter包装了操作的过程. 当然,这里不会讨论IndexWriter的每个细节,这里主要介绍IndexWriter的常用法和实际使用中遇到的部署问题. 5.1 IndexWr

Lucene.Net 2.3.1开发介绍 —— 二、分词(六)

原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(六) Lucene.Net的上一个版本是2.1,而在2.3.1版本中才引入了Next(Token)方法重载,而ReusableStringReader类也是在新版本中引入的.这样改变,导致了2.3.1版本不得不修改2.1版以前的所有分词器.带来的另外一个问题的是,以前的一些现有分词器,拿到这里可能就不能用了.   要使用ReadToEnd还有另外一个解决方法--修改Lucene.Net源码.   在修改之前,我们需要知道Reusab

Lucene.Net 2.3.1开发介绍——附录一、如何下载Lucene.Net的各种版本

原文:Lucene.Net 2.3.1开发介绍--附录一.如何下载Lucene.Net的各种版本 首先,你需要一个svn客户端.TortoiseSVN非常好用,可以从官方网站下载.下载地址:http://tortoisesvn.net/downloads.下载完成,就安装,需要重启电脑.然后在d盘下建立一个空文件夹,命名为Lucene.Net.打开文件夹,右键,则出现菜单.如图"附录一 1". 附录一 1 发现多了两项,分别是SVN Checkout和TortoiseSVN.点&quo