原文: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;1314    class Program15    {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        }2526        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;1516    class Program17    {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();2627            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);3132            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();3839            Console.ReadKey();40        }4142        //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是怎么得出来的?结果的顺序是怎么决定的?这些又是留下来的问题。

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

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

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

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(三) Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了. 代码 4.3.4.1 Analyzer anal ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(二) 4.3 表达式用户搜索,只会输入一个或几个词,也可能是一句话.输入的语句是如何变成搜索条件的上一篇已经略有提及. 4.3.1 观察 ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索.搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此 ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(六) 2.2 Field的Boost 如果说Document的Boost是一条线,那么Field的Boost则是一个点.怎么理解这个点呢 ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个 ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果 索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是F ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(一) 在说索引之前,先说说索引是什么?为什么要索引?怎么索引? 先想想看,假如现在有一个文本,我们会怎么去搜索.比如,有一个string ...

随机推荐

  1. 正则表达式验证数字、汉字、电话号码,email,整数,浮点数

    验证数字的正则表达式集 验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0- ...

  2. 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别

    Activity.finish()Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Act ...

  3. android软键盘弹出隐藏的监听

    通过网上搜索关于软键盘的隐藏弹出的监听,有几种方式,其中最有效的方式是在View的Onlayout()里面做文章 具体代码: 将布局视图自定义,重写onlayout()方法,然后在主Activity里 ...

  4. winform 之1---窗体介绍

    窗体是winform开发的基础,需要掌握窗体的创建.属性.调用和窗体传值等等. 1.在项目中添加窗体很简单,在项目上点击右键,选择添加windows窗体即可为项目添加新的窗体. 2.窗体的属性设置,右 ...

  5. inheritAll 及 ant antfile案例分析

    <?xml version="1.0"?> <project name="a" default="targeta"> ...

  6. Python 第六篇(上):面向对象编程初级篇

    面向:过程.函数.对象: 面向过程:根据业务逻辑从上到下写垒代码! 面向过程的编程弊:每次调用的时候都的重写,代码特别长,代码重用性没有,每次增加新功能所有的代码都的修改!那有什么办法解决上面出现的弊 ...

  7. Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识

    第1节 pandas 回顾 第2节 读写文本格式的数据 第3节 使用 HTML 和 Web API 第4节 使用数据库 第5节 合并数据集 第6节 重塑和轴向旋转 第7节 数据转换 第8节 字符串操作 ...

  8. 解决linux下javac -version和java -version版本显示不一致

    解决linux下javac -version和java -version版本显示不一致 [javascript] view plaincopy [root@localhost usr]# $JAVA_ ...

  9. [置顶] think in java interview-高级开发人员面试宝典(八)

    面经出了7套,收到许多读者的Email,有许多人说了,这些基础知识是不是为了后面进一步的”通向架构师的道路“做准备的? 对的,你们没有猜错,就是这样的,我一直在酝酿后面的”通向架构师的道路“如何开章. ...

  10. spark集群安装配置

    spark集群安装配置 一. Spark简介 Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发.Spark基于map reduce 算法模式实现的分布式计算,拥有Hadoo ...