|
||||||
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
DotLucene: 优秀的全文搜索引擎有可能用37行代码写一个全文搜索么? 恩,我正准备使点小技巧用DotLucene来完成这个麻烦的工作. DotLucene 是一个Jakarta Lucene搜索引擎的移植项目,该项目由 George Aroush et al 维护。下面是它的一些特性:
注意 不要过于在意代码行数。我将用不超过37行代码给你演示他的核心功能,但是要做成一个真正实用的应用,你还需要花更多的时间... 演示项目这里,我们将做一个简单的项目演示怎么去做到如下几点:
DotLucene还具有更多的潜力。在实际的应用中你大概想这么去做:
为什么不使用微软索引服务(Microsoft Indexing Server)?如果你喜欢用索引服务,没问题。然而,使用DotLucene会有更多好处:
第1行:建立索引下面的代码从存盘存储建立一个新的索引,directory是存储索引的目录路径参数。 IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(), true); 这个例子中我们总是重新创建索引(In this example we always create the index from scratch),但这不是必须的,你也可以打开一个已有的索引并添加文档进去。你还可以通过删除然后添加它们的新版本来更新现存的文档(译注:这里应该是指对象的创建) 第2 - 12行:添加文档我们为每一个HTML文档添加两个字段到索引:
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, "..."); // ... } 资源相关文章
|