@ITの掲示板でBlogEngine.NETの検索機能についての質問が上がっていたので、ちょっとコードを見てみました。
BlogEngineでは、Core.dllのSearch.csで検索ワードのマッチングを行っています。メインの処理に当たるのが、以下のBuildResultSetメソッドです。
1: private static List<Result> BuildResultSet(string searchTerm, bool includeComments)
2: {
3: List<Result> results = new List<Result>();
4: string term = CleanContent(searchTerm.
5: ToLowerInvariant().Trim(), false);
6: string[] terms = term.Split(new char[] { ' ' },
7: StringSplitOptions.RemoveEmptyEntries);
8: string regex = string.Format(System.Globalization.
9: 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: }
ここでやっているのは、ブログのエントリをコレクションで取得して、それらをループして、正規表現でマッチングしています。マッチングしたエントリにポイントを与えて重みづけをしています。重みづけの仕組みは、タイトルでマッチングした場合はマッチ回数×20、Description(メタ)だとマッチ回数×2、本文とコメントだとマッチ回数、という感じで合算しています。そして、最後にソートして戻しています。
BlogEngine.NETはデータストアにXMLやSQL Serverや他のDBを切り替れるプロバイダモデルを採用しています。データベース固定であれば、SQLのLIKEもしくは全文検索サービスを使う手もあるかもしれませんが、ここでは、汎用的で自由が利く正規表現を使って検索を行っているのだと思います。