快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19
t;Result, IPublishable>(ResultToPost));
12    results.Clear();
13    OnSearcing(searchTerm);
14    return items;
15  }
16}
17
18public static List<IPublishable> ApmlMatches(XmlDocument apmlFile, int maxInterests)
19{
20  Dictionary<string, float> concepts = new Dictionary<string, float>();
21  XmlNodeList nodes = apmlFile.SelectNodes("//Concept");
22  foreach (XmlNode node in nodes)
23  {
24    string key = node.Attributes["key"].InnerText.ToLowerInvariant().Trim();
25    float value = float.Parse(node.Attributes["value"].InnerText, System.Globalization.CultureInfo.InvariantCulture);
26    if (!concepts.ContainsKey(key))
27    {
28      concepts.Add(key, value);
29    }
30    else if (concepts[key] < value)
31    {
32      concepts[key] = value;
33    }
34  }
35
36  concepts = SortDictionary(concepts);
37  int max = Math.Min(concepts.Count, maxInterests);
38  int counter = 0;
39  List<Result> resultSet = new List<Result>();
40  foreach (string key in concepts.Keys)
41  {
42    counter++;
43    List<Result> results = BuildResultSet(key, false);
44    //results = results.FindAll(delegate(Result r) { return r.Rank > 1; });
45    resultSet.AddRange(results);
46    if (counter == max)
47      break;
48  }
49
50  resultSet.Sort();
51  List<Result> aggregatedResults = new List<Result>();
52  foreach (Result r in resultSet)
53  {
54    if (!aggregatedResults.Contains(r))
55    {
56      aggregatedResults.Add(r);
57    }
58    else
59    {
60      Result existingResult = aggregatedResults.Find(delegate(Result res) { return res.GetHashCode() == r.GetHashCode(); });
61      existingResult.Rank += r.Rank;
62    }
63  }
64
65  aggregatedResults = aggregatedResults.FindAll(delegate(Result r) { return r.Rank > 1; });
66  List<IPublishable> items = aggregatedResults.ConvertAll(new Converter<Result, IPublishable>(ResultToPost));
67  List<IPublishable> uniqueItems = new List<IPublishable>();
68
69  foreach (IPublishable item in items)
70  {
71    if (!uniqueItems.Contains(item))
72      uniqueItems.Add(item);
73  }
74
75  return uniqueItems;
76}

其中Hits是直接根据内容进行查找,ApmlMatches是为支持Apml而提供的(下文做了进一步的解释)。在Search类的静态构造函数中我们可以看到Search类监听了很多实现IPublishable接口的BusinessBase的事件以便来重新构造目录,这个目录也是在内存中已经存在的,每当有新的文章等可以被搜索到的对象(实现IPublishable接口)被保存时,它就会被重新建立,以Post为例:

1/**//// <summary>
2/// Adds a post to the catalog when it is added.
3/// </summary>
4private static void Post_Saved(object sender, SavedEventArgs e)
5{
6  lock (_SyncRoot)
7  {
8    if (e.Action == SaveAction.Insert)// 插入时进行添加
9    {
10      AddItem(sender as Post

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号