分享
 
 
 

DotLucene:37行代码全文搜索

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

DotLucene是一个强有力的开源全文搜索引擎,它是从Apache的Lucene(java)项目移植到.Net(C#)上的。 DotLucene的效率非常高,并且还具有对搜索结果评级、高光、搜索非结构数据以及本地化等特点。它还和Lucene的索引兼容,因此你可以在不同的平台间迁移而不会丢失任何索引数据。

本文介绍了如何通过简洁的代码来使用DotLucene完成全文搜索功能。

本文翻译自CodeProject上 Dan Letecky 的 DotLucene: Full-Text Search for Your Intranet or Website using 37 Lines of Code 一文,文章版权为原作者所有。

译者:Samuel Chen

本文源代码下载 - 363 KbDotLucene在线演示 Download下载包含预生成索引和HTML文档的源代码 [链接]

DotLucene: 优秀的全文搜索引擎有可能用37行代码写一个全文搜索么? 恩,我正准备使点小技巧用DotLucene来完成这个麻烦的工作. DotLucene 是一个Jakarta Lucene搜索引擎的移植项目,该项目由 George Aroush et al 维护。下面是它的一些特性:

它能被用在 ASP.NET、WinForms 或者 console 应用; 非常高效的性能; 搜索结果评级; 搜索结果中查询关键字高光 ; 搜索结构化和非结构化数据; Metadata 搜索 (时间查询、搜索指定域/字段...) 索引大小大约是索引文本的30%; 并且能存储所有编入索引的文档 Can store also full indexed documents 纯.Net托管代码,单个执行文件 (244 kB) 非常友好的许可 (Apache Software License 2.0) 本地化 (支持 巴西语、捷克语、中文、荷兰语、英语、法语、日语、韩语和俄语) 可扩展 (源代码已包含) 注意 不要过于在意代码行数。我将用不超过37行代码给你演示他的核心功能,但是要做成一个真正实用的应用,你还需要花更多的时间...

演示项目这里,我们将做一个简单的项目演示怎么去做到如下几点:

索引在指定目录(包括子目录)中找到的Html文件 用一个ASP.NET应用程序来搜索索引 搜索结果中高亮显示查询的单词DotLucene还具有更多的潜力。在实际的应用中你大概想这么去做:

当目录中怎就新文档时添加到索引,而不用重新编译整个索引 包含各种文件类型。DotLuncene能够索引任何能转换成纯文本的文件类型 为什么不使用微软索引服务(Microsoft Indexing Server)?如果你喜欢用索引服务,没问题。然而,使用DotLucene会有更多好处:

DotLucene 是一个100%托管代码的单执行文件,不需要任何依赖 它能被使用到一个共享主机。如果事先准备好索引,你可以不需要磁盘的写权限 使用它,你可以从任何源((数据库、网站...)索引任何类型数据(电子邮件、XML、HTML文件...)。那是因为你需要提供纯文本给索引器(Indexer),载入和解析取决于你 允许你选择要包含在索引中的指定属性("字段"),从而你可以使用这些字段来搜索(例如,作者、日期、关键字等) 它是一个开源软件 它易于扩展第1行:建立索引下面的代码从存盘存储建立一个新的索引,directory是存储索引的目录路径参数。

IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(), true);

这个例子中我们总是重新创建索引(In this example we always create the index from scratch),但这不是必须的,你也可以打开一个已有的索引并添加文档进去。你还可以通过删除然后添加它们的新版本来更新现存的文档(译注:这里应该是指对象的创建)

第2 - 12行:添加文档我们为每一个HTML文档添加两个字段到索引:

"text" 字段,容纳HTML文件的文本内容(去除了标记),文本数据本身并不会存储在索引中 "path" 字段,容纳文件路径,它将会被(索引并)完整的存入索引中 public void AddHtmlDocument(string path)

{

Document doc = new Document();

string rawText;

using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Default))

{

rawText = parseHtml(sr.ReadToEnd());

}

doc.Add(Field.UnStored("text", rawText));

doc.Add(Field.Keyword("path", path));

writer.AddDocument(doc);

}

第13 - 14行:优化并保存索引 添加完文档后,你需要关闭索引器。使用优化将会提高搜索性能。

writer.Optimize();

writer.Close();

第15行:打开索引搜索在做任何搜索之前,你需要打开索引。directory参数是存储索引的目录路径。

IndexSearcher searcher = new IndexSearcher(directory);

第16 - 27行:搜索现在,我们解析查询了("text"是默认搜索字段)

Query query = QueryParser.Parse(q, "text", new StandardAnalyzer());

Hits hits = searcher.Search(query);

变量hits是搜索结果文档的集合,我们将通过它来将结果存储到DataTable

DataTable dt = new DataTable();

dt.Columns.Add("path", typeof(string));

dt.Columns.Add("sample", typeof(string));

for (int i = 0; i < hits.Length(); i++)

{

// get the document from index

Document doc = hits.Doc(i);

// get the document filename

// we can't get the text from the index because we didn't store it there

DataRow row = dt.NewRow();

row["path"] = doc.Get("path");

dt.Rows.Add(row);

}

第28 - 37行:高亮Lines 28 - 37: Query Highlighting 我们先创建一个高亮器对象highlighter,并将使用加黑(bold)字体来高亮显示(<B>查询词</B>)。

QueryHighlightExtractor highlighter = new

QueryHighlightExtractor(query, new StandardAnalyzer(), "<B>", "</B>");

通过对结果遍历,我们将载入原文中最相似的部分。

for (int i = 0; i < hits.Length(); i++)

{

// ...

string plainText;

using (StreamReader sr = new StreamReader(doc.Get("filename"),

System.Text.Encoding.Default))

{

plainText = parseHtml(sr.ReadToEnd());

}

row["sample"] = highlighter.GetBestFragments(plainText, 80, 2, "...");

// ...

}

资源DotLucene download Run DotLucene online demo DotLucene online demo notes DotLucene documentation

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有