这就是我现在作为一个非常基本的搜索:
var Results = from p in dx.Listings select p;
if (CategoryId > 0) Results = Results.Where(p => p.CategoryId == CategoryId);
if (SuburbId > 0) Results = Results.Where(p => p.SuburbId == SuburbId);
var OrderedResults = Results.OrderByDescending(p => p.ListingType);
OrderedResults = OrderedResults.ThenByDescending(p => p.Created);
据我所知,我可以添加一个.Contains()或类似内容,然后从关键字框中输入关键字(拆分成单个项目),这样就可以得到结果列表。
但是我需要按基本相关性排序结果。这意味着如果记录A包含2个关键字(在'Body'nvarchar(MAX)字段中),则它应该高于仅与1个关键字匹配的记录B.我不需要对每一次打击都进行全面计算......但是,如果能够管理那些那就没问题了。
那么有没有办法直接将命中数作为orderby的一部分来获得?我可以通过获取结果和解析来管理它,但是我真的不想这样做,因为解析可能有数千人可能会破坏IIS机器,而SQL Server是一个非常强大的集群:)
如果有人有任何想法或提示,那将是一个很大的帮助。
答案 0 :(得分:2)
如果我理解正确,你想打电话给OrderyByDescending( p => p.Body )
,但应该按照某个单词在p.Body中播放多少次来排序?
然后你应该能够创建一个计算事件的方法并返回计数,然后你可以简单地OrderyByDescending( p => CountOccurences(p.Body) )
您也可以创建 BodyComparer 类来实现 IComparer ,然后将其传递给 OrderByDescending
编辑: 看一下这个链接Enable Full Text Searching
答案 1 :(得分:0)
这是一个简单的例子,如果我理解你正在寻找什么:
var storedData = new[]{
new int[] {1, 2, 3, 4},
new int[] {1, 2, 3, 4, 5}
};
var itemsFromTextBox = new[] { 3, 4, 5 };
var query = storedData.Where(a => a.ContainsAny(itemsFromTextBox))
.OrderByDescending(a => itemsFromTextBox.Sum(i => a.Contains(i)? 1:0));
使用以下ContainsAny扩展名:
public static bool ContainsAny<T>(this IEnumerable<T> e1, IEnumerable<T> e2)
{
foreach (var item in e2)
{
if (e1.Contains(item)) return true;
}
return false;
}