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