我有以下查询效果很好:
string[] Words = {"search","query","example"};
... Snip ...
var Results = (
from a in q
from w in Words
where
(
a.Title.ToLower().Contains(w)
|| a.Body.ToLower().Contains(w)
)
select new
{
a,
Count = 0
}).OrderByDescending(x=> x.Count)
.Distinct()
.Take(Settings.ArticlesPerPage);
我需要它做的是返回Count
这是单词的总出现次数。我也会以支持标题来衡量它,例如:
Count = (OccuranceInTitle * 5) + (OccurancesInBody)
我假设我需要使用Linq.Count,但我不确定如何在这个实例中应用它。
答案 0 :(得分:5)
这就是我提出的:
var query =
from a in q
from w in Words
let title = a.Title.ToLower()
let body = a.Body.ToLower()
let replTitle = Regex.Replace(title, string.Format("\\b{0}\\b", w), string.Empty)
let replBody = Regex.Replace(body, string.Format("\\b{0}\\b", w), string.Empty)
let titleOccurences = (title.Length - replTitle.Length) / w.Length
let bodyOccurences = (body.Length - replBody.Length) / w.Length
let score = titleOccurences * 5 + bodyOccurences
where score > 0
select new { Article = a, Score = score };
var results = query.GroupBy(r => r.Article)
.OrderByDescending(g => g.Sum(r => r.Score))
.Take(Settings.ArticlesPerPage);
计算事件是通过(令人惊讶的)快速而肮脏的方法来完成的,用string.Empty
替换事件并根据得到的字符串长度进行计算。在计算每篇文章和每个单词的分数之后,我将对每篇文章进行分组,按所有单词的分数总和排序并从结果中取出一大块。
我没有启动编译器,所以请原谅任何明显的错误。
更新:此版本使用正如
中的正则表达式Regex.Replace(title, string.Format("\\b{0}\\b", w), string.Empty)
而不是原始版本的
title.Replace(w, string.Empty)
这样它现在只匹配整个单词(string.Replace
版本也会匹配单词片段。)