·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 【转载】Lucene.Net无障碍学习和使用:搜索篇

【转载】Lucene.Net无障碍学习和使用:搜索篇

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

【转载】Lucene.Net无障碍学习和使用:搜索篇

在上一篇中,我们初步理解了索引的增删改查基本操作。本文着重介绍一下常用的搜索,以及搜索结果的排序和分页。本文的搜索主要是基于前一篇介绍的文本文件的索引,建议下载最后改进的demo对照着看阅读本文,同时大家可以自己动手创建一些测试文本,然后建立索引并搜索试试看。

一、初步认识搜索

先从上一篇示例代码中我们摘录一段代码看看搜索的简单实现:

1234567891011121314151617181920212223PRivate TopDocs Search(string keyWord,string field){TopDocs docs = null;int n = 10;//最多返回多少个结果SetOutput(string.Format("正在检索关键字:{0}", keyword));try{QueryParser parser = new QueryParser(field, new StandardAnalyzer());Query query = parser.Parse(keyword);//搜索内容 contents (用QueryParser.Parse方法实例化一个查询)Stopwatch watch = new Stopwatch();watch.Start();docs = searcher.Search(query, (Filter)null, n); //获取搜索结果watch.Stop();StringBuffer sb = "索引完成,共用时:" + watch.Elapsed.Hours + "时 " + watch.Elapsed.Minutes + "分 " + watch.Elapsed.Seconds + "秒 " + watch.Elapsed.Milliseconds + "毫秒";SetOutput(sb);}catch (Exception ex){SetOutput(ex.Message);docs = null;}return docs;}

从上面代码,我们不难看出,搜索需要用到IndexSearcher,Query,QueryParser和TopDocs(或者Hits)四个核心类:

1、 IndexSearcherIndexSearcher会打开索引文件,它不使用Lucene.Net的锁,可以理解为只读操作。它的Search方法是我们最常用的,该方法返回我们需要的结果。2、QueryParserQueryParser是Query的构造器,它的Parse方法会根据Analyzer构造一个合理的Query对象来应对搜索。

3、QueryQuery类作为查询表达式的载体同样至关重要,它有丰富的子类,让我们可以应对多种变化的搜索需求,简单来说,我们想到的常用搜索Lucene.Net几乎已经都给我们实现了,你只要分辨应该使用那个类来搜索比较合理。

4、TopDocs(或者Hits)

这个类我们可以简单把它理解成它就是我们要的搜索结果集,通过它我们可以知道记录集合中的各个Document的详细信息:

?
12345678910111213141516171819202122232425262728293031/// <summary>/// 显示搜索结果/// </summary>/// <param name="queryResult"></param>private void ShowFileSearchResult(TopDocs queryResult){if (queryResult == null || queryResult.totalHits == 0){SetOutput("Sorry,没有搜索到你要的结果。");return;}int counter = 1;foreach (ScoreDoc sd in queryResult.scoreDocs){try{Document doc = searcher.Doc(sd.doc);string id = doc.Get("id");//获取idstring fileName = doc.Get("filename");//获取文件名string contents = doc.Get("contents");//获取文件内容string result = string.Format("这是第{0}个搜索结果,Id为{1},文件名为:{2},文件内容为:{3}{4}", counter, id, fileName, Environment.NewLine, contents);SetOutput(result);}catch (Exception ex){SetOutput(ex.Message);}
  • 上一篇文章:
  • 下一篇文章: