lucene创建索引,查询索引
在NuGet安装PanGu和Lucene.Net

创建索引
IndexWriter writer = new IndexWriter(IndexDic, PanGuAnalyzer, isCreate, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
IndexDic是索引存放目录
PanGuAnalyzer是盘古解析器(由于默认的解析器解析能力不强,所以替换为这个)
IsCreate是索引创建方式(true:重新新建索引,false:从旧的索引执行追加)
Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED是文件长度是否限制
static void Main(string[] args) {
//Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_CURRENT);
Analyzer analyzer = new Lucene.Net.Analysis.PanGu.PanGuAnalyzer();//PanGuAnalyzer是盘古解析器(由于默认的解析器解析能力不强)
Lucene.Net.Store.Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo("Dic")); //创建索引 IndexWriter writer = new IndexWriter(directory, analyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED); AddDocument(writer, "精通Visual C#2005——语言基础、数据库系统开发、Web开发(附光盘)", @"本书体系完整,结合应用介绍了Visual Studio.NET平台下的C#编程技术,全书分为4个部分:C#编程基础、.NET类库剖析、开发网络程序和综合案例,共23章,并附有大量代码实例。第一部分介绍了使用C#语言进行面向对象系统开发的基本知识;第二部分详细介绍了.NET类库中的部分常用空间,熟练掌握这些基本对象是利用C#开发程序的基础;第三部分具体介绍了利用C#开发ASP.NET Web系统的技术;最后一部分给出了4个结构完整的案例。 全书紧密结合开发实例展开,是一本教科书和参考书的结合体。初级读者可以系统学习本书,整体掌握使用C#语言进行应用程序开发的技术;中级读者可跳过或浏览熟悉的内容;对高级读者而言,本书可以作为一本开发手册使用。", "20061101"); AddDocument(writer, "SQL Server 2008 的发布", "SQL Server 2008 的新特性", "20060101"); AddDocument(writer, "ASP.Net MVC框架配置与分析", "而今,微软推出了新的MVC开发框架,也就是Microsoft ASP.NET 3.5 Extensions", "20060111"); AddDocument(writer, "中日关系", "中方和日方一衣带水", "20060130"); AddDocument(writer, "中日关系", "中国某高层领导说日本欠扁", "20060401"); AddDocument(writer, "中日合作", "中日合作多个项目", "20060131"); writer.Optimize(); writer.Close(); }
Field构造函数说明:
第一个是字段名称(实例里是Title,Content,AddTime)。
第二个是字段的存储方式(Field.Store.YES:进行存储,Filed.Store.No:不进行存储)有些字段值比较大,可以选择No不存储,对字段进行存储是为了检索的时候对某些字段进行提取。
第三个是是否索引(Field.Index.ANALYZED:索引, Field.Index.NOT_ANALYZED:非索引)
static void AddDocument(IndexWriter writer, string title, string content,string time) { Document document = new Document(); document.Add(new Field("title",title,Field.Store.YES,Field.Index.ANALYZED));//存储且索引 document.Add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED)); document.Add(new Field("time",time,Field.Store.YES,Field.Index.ANALYZED)); writer.AddDocument(document); }
生成索引

查询索引
lucene的搜索相当强大,它提供了很多辅助查询类,每个类都继承自Query类,各自完成一种特殊的查询,你可以像搭积木一样将它们任意组合使用,完成一些复杂操 作;另外lucene还提供了Sort类对结果进行排序,提供了Filter类对查询条件进行限制
static void Main(string[] args) { Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_CURRENT); Lucene.Net.Store.Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo("Dic")); IndexSearcher searcher = new IndexSearcher(directory, true);//索引查询器,它的构造函数有两个参数,一个是索引文件路径,一个是是否只读(一般都设置为true就可以)。这个东西可以理解为SqlServer里面的查询分析器 MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_CURRENT, new string[] { "title", "content" }, analyzer); QueryParser titleQueryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_CURRENT, "title", analyzer); Query titleQuery = titleQueryParser.Parse("与"); TermQuery contentQuery = new TermQuery(new Term("cotent", "M"));//最基本查询 PhraseQuery pTitleQuery = new PhraseQuery();//文字中间间隔查询 pTitleQuery.Slop = 5;//文字中间间隔 pTitleQuery.Add(new Term("content", "中")); pTitleQuery.Add(new Term("content", "日")); PrefixQuery prefixQuery = new PrefixQuery(new Term("content", "本"));//以某字开头的 Query fuzzyQuery = new FuzzyQuery(new Term("content", "NET"));//用来搜索相似的term TermRangeQuery rangeQuery = new TermRangeQuery("time", "20060101", "20060130", true, true);//搜索时间域 BooleanQuery bq = new BooleanQuery(); //SHOULD:或,MUST:与,MUST_NOT:非 bq.Add(titleQuery, Occur.SHOULD); bq.Add(contentQuery, Occur.SHOULD); bq.Add(pTitleQuery, Occur.SHOULD); bq.Add(prefixQuery, Occur.SHOULD); bq.Add(fuzzyQuery, Occur.SHOULD); bq.Add(rangeQuery, Occur.MUST); Stopwatch stopwatch = Stopwatch.StartNew(); Sort sort = new Sort();//索引排序类 sort.SetSort(new SortField("time", SortField.STRING, true));//构造函数第三个字段true为降序,false为升序 //TopScoreDocCollector collector = TopScoreDocCollector.Create(10 * 1000, true); //searcher.Search(bq,null, collector); TopDocs topDoc = searcher.Search(bq, (Filter)null, 10 * 1000, sort);//查询后返回的文档,可以理解为Sqlserver的表 //TopDocs topDoc = collector.TopDocs(0, collector.TotalHits); //for (var i = 0; i < collector.TotalHits; i++) for (var i = 0; i < topDoc.TotalHits; i++) { Lucene.Net.Documents.Document docs = searcher.Doc(topDoc.ScoreDocs[i].Doc); string title = docs.Get("title"); string content = docs.Get("content"); Console.WriteLine(title + "\n" + content); } stopwatch.Stop(); Console.Read(); }
Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。
Lucene.net并不是一个爬行搜索引擎,也不会自动地索引内容。我们得先将要索引的文档中的文本抽取出来,然后再将其加到Lucene.net索引中。标准的步骤是先初始化一个Analyzer、打开一个IndexWriter、然后再将文档一个接一个地加进去。一旦完成这些步骤,索引就可以在关闭前得到优化,同时所做的改变也会生效。这个过程可能比开发者习惯的方式更加手工化一些,但却在数据的索引上给予你更多的灵活性。
(来自百度百科)

浙公网安备 33010602011771号