·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 【转载】Lucene.Net无障碍学习和使用:搜索篇
在上一篇中,我们初步理解了索引的增删改查基本操作。本文着重介绍一下常用的搜索,以及搜索结果的排序和分页。本文的搜索主要是基于前一篇介绍的文本文件的索引,建议下载最后改进的demo对照着看阅读本文,同时大家可以自己动手创建一些测试文本,然后建立索引并搜索试试看。
先从上一篇示例代码中我们摘录一段代码看看搜索的简单实现:
1234567891011121314151617181920212223 | PRivate 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" ); //获取id
string 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);
}
|