Tom*_*len 3 c# linq asp.net search count
我有以下查询,它很有用:
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);
Run Code Online (Sandbox Code Playgroud)
我需要它做的是返回Count,这是单词的总出现次数.我也会对它进行加权以支持标题,例如:
Count = (OccuranceInTitle * 5) + (OccurancesInBody)
Run Code Online (Sandbox Code Playgroud)
我假设我需要使用Linq.Count但我不确定如何在这个实例中应用它.
这就是我想出的:
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);
Run Code Online (Sandbox Code Playgroud)
使用(令人惊讶的)快速和脏的方法来string.Empty计算出现次数,用基于结果的字符串长度替换出现次数和计算.在计算每篇文章和每个单词的分数之后,我将对每篇文章进行分组,按所有单词的分数总和排序并从结果中取出一个大块.
我没有启动编译器,所以请原谅任何明显的错误.
更新:此版本使用正则表达式,如
Regex.Replace(title, string.Format("\\b{0}\\b", w), string.Empty)
Run Code Online (Sandbox Code Playgroud)
而不是原始版本
title.Replace(w, string.Empty)
Run Code Online (Sandbox Code Playgroud)
所以它现在只匹配整个单词(string.Replace版本也会匹配单词片段).