Lucene.net提供了很全面的数据搜索操作,你可以利用Lucene.net检索磁盘中的文件,网页,数据库中的数据,但是前提是预先对数据创建索引。
Lucene索引过程分为三个主要的操作阶段:将数据转换成文本、分析文本、并将分析过的文本保存到索引库中。如图所示:

1.数据转成文本:须将数据转换成Lucene能够处理的格式——纯文本字符流。
2.分析文本:完成了针对待索引数据的预处理操作,并创建了带有若干个域的Document对象,就可以调用IndexWriter的addDocument(Document)方法,将数据传递给Lucene来进行索引操作。在对数据进行索引处理时,Lucene会首先分析(analyze)数据使之更加适合被索引。
3.将分析过的文本保存到索引库中:对输入数据分析处理完之后,就可以将结果写入到索引文件中。Lucene将输入数据以一种称为倒排索引(inverted index)的数据结构进行存储。在进行关键字快速查找时,这种数据结构能够有效地利用磁盘空间。
下面介绍下Lucene.net中处理索引的类:
IndexWriter
IndexWriter是索引中负责操作的核心,它负责把索引文件写入存储介质,是控制逻辑存储转换为物理存储的纽带。
Document
Document就是一条虚拟记录,可以理解为数据里的一行。正是有了它,才使我们可以很方便并且易于理解地操作索引文件。它一般记录了需要用到的一个文档的属性,当然,这需要和Field联合使用。
Field
Field类就是数据库里的一列。一个文档有标题,内容,作者,创建时间这四个属性的话,那么就需要四个Field保存这些属性,然后把四个Field加入到Document中。
Field的构造函数比较多。其中Store,Index和TermVector是通过内部类指定的。
(1)--Store 有三个选项:
Field.Store.COMPRESS表示被压缩存储;
Field.Store.YES表示储存;
Field.Store.NO表示不被存储。
(2)--Index的选项有四个:
Field.Index.NO表示不建立索引;
Field.Index.TOKENIZED表示分词后索引;
Index.NO_NORMS表示值存储内容;
Field.Index.UN_TOKENIZED表示不分词索引。
(3)--TermVector这个参数也不常用,它有五个选项。
Field.TermVector.NO表示不索引Token的位置属性;
Field.TermVector.WITH_OFFSETS表示额外索引Token的结束点;
Field.TermVector.WITH_POSITIONS表示额外索引Token的当前位置;
Field.TermVector.WITH_POSITIONS_OFFSETS表示额外索引Token的当前和结束位置;
Field.TermVector.YES则表示存储向量。
通过实例生成数据索引:
这里我将数据保存在Access数据库中,对Access数据库中的数据进行索引:
保存数据的表:数据库中保存了1000条数据

为数据创建索引代码:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.IO;
usingSystem.Text.RegularExpressions;
usingSystem.Data.SqlClient;
usingLucene.Net.Analysis;
usingLucene.Net.Documents;
usingLucene.Net.Index;
usingLucene.Net.Analysis.KTDictSeg;
usingLuceneSearch;
///<summary>
///CreateIndex的摘要说明
///</summary>
publicclassCreateIndex
{
//词库路径
publicstringwordPath;
publicstringindexDirectory;
//定义一个IndexWriter
protectedIndexWriterwriter=null;
//需要导出的数目
publicintallNum;
//当前完成的数目
publicintcompleteNum;
//需要生成的表
publicDataTabledt;
DAL.OperSqlos=newDAL.OperSql();
publicCreateIndex()
{
}
publicvoidGetIndex(intinum)
{
//定义分析器
AnalyzerKTDAnalyzer=newKTDictSegAnalyzer(wordPath);
//PerFieldAnalyzerWrapper可以对不同的Field进行不同的分析
PerFieldAnalyzerWrapperwrapper=newPerFieldAnalyzerWrapper(KTDAnalyzer);
wrapper.AddAnalyzer("ID",KTDAnalyzer);
wrapper.AddAnalyzer("News_Url",KTDAnalyzer);
wrapper.AddAnalyzer("News_Date",KTDAnalyzer);
//判断是否已有索引
boolisure=!IndexReader.IndexExists(indexDirectory);
//创建索引的数据条数
allNum=dt.Rows.Count;
//创建IndexWriter
writer=newIndexWriter(indexDirectory,wrapper,isure);
writer.SetUseCompoundFile(true);//显式设置索引为复合索引
writer.SetMaxFieldLength(int.MaxValue);//设置域最大长度为最大值
writer.SetMergeFactor(allNum+100);//设置每100个段合并成一个大段
writer.SetMaxMergeDocs(10000);//设置一个段的最大文档数
writer.SetMaxBufferedDocs(1000);//设置在把索引写入磁盘前内存里文档的缓存个数
//创建IndexReader
IndexReaderreader=null;
boolneedre=inum==1;
reader=IndexReader.Open(indexDirectory);
for(inti=0;i<dt.Rows.Count;i++)
{
completeNum=i+1;
stringbody=parseHtml(dt.Rows[i]["News_Body"].ToString());
stringtitle=parseHtml(dt.Rows[i]["News_Title"].ToString());
if(title.Length>2&&body.Length>2)
{
if(needre)
{
Termterm=newTerm("ID",dt.Rows[i]["ID"].ToString());
reader.DeleteDocuments(term);
}
Documentdocument=newDocument();
document.Add(newField("ID",dt.Rows[i]["ID"].ToString()??"",Field.Store.YES,Field.Index.UN_TOKENIZED));
document.Add(newField("News_Title",title,Field.Store.NO,Field.Index.TOKENIZED));
document.Add(newField("News_Body",body,Field.Store.NO,Field.Index.TOKENIZED));
document.Add(newField("News_Url",dt.Rows[i]["News_Url"].ToString()??"",Field.Store.YES,Field.Index.UN_TOKENIZED));
document.Add(newField("News_Date",DateField.DateToString(Convert.ToDateTime(dt.Rows[i]["News_Date"].ToString()))??"",Field.Store.YES,Field.Index.UN_TOKENIZED));
writer.AddDocument(document);;
}
}
reader.Close();
writer.Optimize();
writer.Close();
}
}
传入参数,生成索引文件:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->try
{
ci.wordPath=Server.MapPath("App_Data")+@"\";//词库路径;
ci.indexDirectory=Server.MapPath("index")+@"\";//词库路径;
ci.dt=dt;
ci.GetIndex(1);
}
其中dt是保存数据的DataTable,wordpath是分词器的词库文件chsstopwords.txt,engstopwords.txt,dict.dct的路径,indexDirectory是生成索引文件的路径。
生成索引成功后,我们会在index文件夹下看到生成的文件:

这样,我们就创建好了数据的索引。检索数据的时候,我们就可以利用它快速的对数据进行检索。
分享到:
相关推荐
总的来说,结合Lucene.Net和盘古分词,开发者可以快速搭建出一个功能完善的中文搜索引擎,为用户提供快速、精准的信息检索服务。通过深入理解Lucene.Net的内部机制和盘古分词的工作原理,可以进一步优化搜索性能,...
这个压缩包包含了Lucene.net的源码和中文学习文档,旨在帮助开发者深入理解并利用Lucene.net来构建高效、功能强大的网站内部搜索引擎。 **一、Lucene.net基础** Lucene.net提供了对文本数据的索引和搜索功能,它...
本文将详细介绍Lucene.Net的基本用法,包括环境搭建、基本应用流程(索引创建与文档搜索)、多字段搜索以及一些高级特性。 #### 二、环境搭建 在使用Lucene.Net之前,需确保已安装.NET Framework或.NET Core环境,...
通过这个Demo,学习者可以深入了解Lucene.NET的工作原理,掌握如何在.NET环境中搭建全文搜索引擎,以及如何自定义Analyzer以适应特定的搜索需求。这对于提升开发者在信息检索领域的技能和职业竞争力至关重要。
- **网站搜索**:许多网站利用 Lucene.NET 提供内部搜索功能,提高用户体验。 - **企业知识库**:企业可以构建基于 Lucene.NET 的知识检索系统,帮助员工快速查找信息。 - **文档管理系统**:支持对大量文档进行高效...
1. **索引创建**:首先,需要对要搜索的数据进行预处理,包括分词、去除停用词等,然后将处理后的数据构建为Lucene.Net的索引。 2. **索引存储**:索引会被持久化存储,以便后续查询使用。可以选择内存、硬盘或者...
这个项目的主要目的是解决在Lucene中对中文文本进行索引和搜索时的效率和准确性问题。 1. **jieba分词库**: Jieba是一个开源的Python库,专门用于中文分词。它提供了精确模式、全模式和搜索引擎模式等不同的分词...
例如,DictSeg.dll和Lucene.Net.Analysis.Cn.dll可以协同工作,对输入的中文文本进行分词处理,然后使用Lucene.Net创建索引;在查询阶段,Highlighter.Net.DLL可以用来高亮显示匹配的查询结果。这四个组件结合在一起...
这个源代码提供了实现这一功能的完整框架,帮助开发者快速搭建自己的站内搜索引擎。以下是对该系统的一些关键知识点的详细说明: 1. ASP.NET基础:ASP.NET是微软提供的一个用于构建Web应用程序的开发平台,它基于...
在IT领域,搜索引擎的搭建是一项复杂而重要的任务,它涉及到数据的索引、查询和检索。本篇将重点讨论如何使用Java和Lucene库来构建一个基础的搜索引擎。Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,...
- 通过一个简单的示例来展示如何使用Lucene创建索引以及如何执行基本的全文搜索操作。 #### 三、Lucene内置Query对象 - Lucene提供了多种查询对象,如TermQuery、BooleanQuery、PhraseQuery等,这些对象用于构造...
- **应用集成**:提供了具体的示例,说明如何将Lucene集成到现有的Java应用中,以便快速搭建搜索服务。 - **章节4:文本分析** - **分析器**:深入讲解了Lucene中的分析器组件,包括分词器、过滤器等,以及如何...
Lucene是一个高性能、全文检索库,它是开源的Java项目,但也有.NET版本(名为Lucene.NET)。Lucene提供了索引和搜索功能,能够高效地处理大量文本数据。它支持倒排索引、TF-IDF评分、布尔查询、短语查询等多种检索...
开发者可以使用Lucene来创建索引,将网站内容或者其他大量文本数据转换成可供快速查询的形式。Lucene支持各种搜索类型,包括模糊搜索、短语搜索和范围搜索,以及高级的布尔运算,使得搜索功能更加灵活和精确。 在...
这需要设计合理的分类结构,并利用全文搜索引擎(如Lucene.NET)或者数据库的全文索引功能进行高效的文档搜索。 6. **版本控制**:为保证文档的完整性,系统应支持版本控制,允许用户查看历史版本和恢复旧版。这...
开发者可能通过SQL查询或者集成全文搜索引擎(如Lucene.NET)来实现对帖子内容的快速查找。 6. 回复与通知: 用户间的交流通过帖子回复实现,这需要处理并发更新和实时通知。ASP.NET可以结合AJAX技术实现无刷新的...
商品搜索功能可以通过Lucene.NET这样的全文搜索引擎实现,提高查询效率和准确性。 3. 购物车和订单处理:购物车功能需要跟踪用户的选购商品,这可以通过Session对象实现。订单处理涉及商品结算、库存更新和支付接口...
4. **全文搜索引擎**:利用Lucene.NET实现强大的图书搜索功能,支持高效的文本检索。 5. **RESTful API设计**:确保前端与后端的通信规范和高效。 6. **UI/UX设计**:创建直观且用户友好的界面,便于用户浏览、搜索...
为了实现快速、精准的搜索,系统可能需要集成全文搜索引擎,如Elasticsearch或Lucene.NET。C#提供与这些引擎的API接口,通过编写查询语句来检索匹配的知识条目。 4. 权限管理: 系统应具备用户身份验证和授权机制...