快速业务通道

BlogEngine.Net架构与源代码分析系列part5:对象搜索

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19
);
11    }
12    else
13    {
14      BuildCatalog();// 否则重建目录
15    }
16  }
17}

这里又体现了BusinessBase提供的静态事件确实很灵活(请参照我的第二篇文章)。Hits方法的的主逻辑是执行BuildResultSet来构造结果集,BuildResultSet使用正则表达式来进行匹配,并按照一定的匹配度算法进行了结果排序:

1/**//// <summary>
2/// Builds the results set and ranks it.
3/// </summary>
4private static List<Result> BuildResultSet(string searchTerm, bool includeComments)
5{
6  List<Result> results = new List<Result>();
7  string term = CleanContent(searchTerm.ToLowerInvariant().Trim(), false);
8  string[] terms = term.Split(new char[] { '' '' }, StringSplitOptions.RemoveEmptyEntries);
9  string regex = string.Format(System.Globalization.CultureInfo.InvariantCulture, "({0})", string.Join("|", terms));
10
11  foreach (Entry entry in _Catalog)
12  {
13    Result result = new Result();
14    if (!(entry.Item is Comment))
15    {
16      int titleMatches = Regex.Matches(entry.Title, regex).Count;
17      result.Rank = titleMatches * 20;
18
19      int postMatches = Regex.Matches(entry.Content, regex).Count;
20      result.Rank += postMatches;
21
22      int descriptionMatches = Regex.Matches(entry.Item.Description, regex).Count;
23      result.Rank += descriptionMatches * 2;
24    }
25    else if (includeComments)
26    {
27      int commentMatches = Regex.Matches(entry.Content + entry.Title, regex).Count;
28      result.Rank += commentMatches;
29    }
30
31    if (result.Rank > 0)
32    {
33      result.Item = entry.Item;
34      results.Add(result);
35    }
36  }
37
38  results.Sort();
39  return results;
40}

ApmlMatches的原理也差不多,这里就不再重复了。

在Search类中,请大家在阅读源代码时注意一下对于一些字符的过滤处理是如何实现的,还有Search中对外公布的几个事件。Entry和Result是为查询时数据的交换而定义的,而Result还实现了IComparable<Result>来对结果排序使用。Search这部分代码给我的感觉就是结构很清晰,但是处理的逻辑很复杂。

那么客户端如何使用Search中的方法?

对于Search方法的调用,一般有两种方式,一种形式如:

List<IPublishable> list = Search.Hits(term, includeComments);

term就是输入的关键词,includeComments为是否包含评论,list是已排序的搜索结果。另一种形式是:

list = Search.ApmlMatches(docs[key], 30);

这是根据一个Uri上的一个Apml文件来对查找结果进行输出,Apml也是一种标准文件,用来定义互联网上一些关键词的活跃程度(自己的话),在BlogEngine.Net中实际上也支持这种Apml,同样也是通过HttpHandler实现的。对于客户端的使用大家可以具体参照一下Web项目中Search.aspx文件中的CodeBehind,此外BlogEngine.Net在Web项目中的Wdiget中也有一个客户端查询,这个以后会在讲解Wdiget时做更多的说明。

总结

1.BlogEngine.Net的搜索还是很经典的,支持开放搜索和Apml等标准。

2.IPublishable的定义很有必要而且处理得很巧妙,解决了搜索对象的统一性问题,以便统一处理。

3.Search类的内核实现比较好,结构很清晰。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号