【问题标题】:LINQ Keyword search with orderby relevance based on count (LINQ to SQL)基于计数的排序相关性的 LINQ 关键字搜索 (LINQ to SQL)
【发布时间】:2009-08-24 14:12:08
【问题描述】:

这是我现在作为一个非常基本的搜索:

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 是一个功能强大的集群:)

如果有人有任何想法或提示,那将是一个很大的帮助。

【问题讨论】:

    标签: c# .net linq linq-to-sql


    【解决方案1】:

    如果我理解正确,你想打电话给OrderyByDescending( p => p.Body ),但它应该按某个单词在 p.Body 中出现的次数排序?

    然后你应该能够创建一个计算出现次数并返回计数的方法,然后你可以简单地做OrderyByDescending( p => CountOccurences(p.Body) )

    您也可以创建一个实现 IComparerBodyComparer 类,然后将其传递给 OrderByDescending

    编辑: 看看这个链接Enable Full Text Searching

    【讨论】:

    • 如果我创建一个自定义函数来添加,那么它将在 Web 服务器上本地解析每条记录,而不是单个 SQL 查询对吗?
    • 正确。您正在尝试通过 LINQ OrderBy 方法使用 SQL 来完成此操作,我现在了解您了吗?
    • Aye :) 到目前为止,我所能想到的可能是一组动态子查询,每个关键字一个,以获取 orderby 的计数......这看起来很乱,呵呵
    • @White Dragon,我一直在搞混 LINQ 试图让它工作。看看我发布的链接。
    • 很酷,快到凌晨 2 点了,所以我最好先崩溃,然后再把代码写进洞里,嘿嘿。我很感激你为我调查这个!这一切都有帮助。
    【解决方案2】:

    这是一个简单的例子,如果我理解你在寻找什么是正确的:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多