如何先按搜索词排序查询结果,然后按字母顺序?

Posted

技术标签:

【中文标题】如何先按搜索词排序查询结果,然后按字母顺序?【英文标题】:How to order query results by search term first, and then alphabetically? 【发布时间】:2011-06-07 10:05:53 【问题描述】:

我正在使用 NHibernate 对项目名称进行搜索。我从数据库中获取了一个分页的项目列表,并按项目名称升序对其进行排序。

所以,如果我搜索“term”,我会在结果中的任何位置返回一个包含“term”的结果页面,并且该页面按字母顺序排列。

例如,结果可能如下所示

a term
d term
g term
j term
p term
s term
term 1
term 2
v term    
z term

从技术上讲,这个列表是正确的,因为它是按字母顺序排列的。

但是,技术上正确对客户来说还不够好。他们希望列表首先按被搜索词的相关性排序,然后按字母顺序。

所以结果会变成

term 1
term 2
a term
d term
g term
j term
p term
s term
v term    
z term

我不知道如何构造这个查询,或者它是否可能。如果这可以在应用程序中完成,那会容易得多,但由于分页,这必须在数据库上完成。这就是使事情复杂化的原因。有人可以在这里指出我正确的方向吗?

【问题讨论】:

通过相关性,我的意思是他们希望被搜索的词在排序中优先。第二个列表中概述了进一步解释这一点的示例。 为什么每个人都在引号中使用“相关性”一词?我写了“相关性”。我在这里错过了什么吗? 安东开始了! :) 但是在这种情况下,相关性的概念可能是一个专有名词。 啊安东,总是开玩笑:-) 但是,是的,这是一个真实的词。我只是好奇我是否不小心弄到了我看不到的东西 【参考方案1】:

我从未见过在 SQL 或 Linq 中使用“相关性”进行搜索的复杂功能。

如果这是我的问题,我希望创建一个实现 IComparer 的自定义帮助器类。然后,您可以在代码中创建任意数量的细微差别的条件。当然,这不是在服务器端完成的。

我想知道是否有第三方 .net 库,可以专门量化相关性。

【讨论】:

您可能想查看您的数据库提供商的全文搜索功能。【参考方案2】:

如果可以编写一个基于相关性返回整数的函数,你可以这样做

SELECT MyField
FROM MyTable
WHERE MyField like '%term%'
ORDER BY GetRelevance(MyField, SearchTerm) DESC

您的函数不必非常复杂。它可以查看字段是否以 SearchTerm 开头并返回 2,如果不返回 1。如果您有更多相关性标准,则可以扩展它。

或者,如果相关性是指以搜索词开头,您也可以将数据库查询拆分为两个并将它们合并在一起。

SELECT MyField
FROM MyTable
WHERE MyField LIKE 'term%' 
ORDER by MyField

union
SELECT MyField
FROM MyTable
WHERE MyField LIKE '%term%' AND NOT LIKE 'term%'
ORDER BY MyField

但这对你的表现不会有好处。

【讨论】:

感谢 Ray,您实现函数的建议成功了。如果您想查看,我已将其添加为性能结果的答案:***.com/questions/6263669/…【参考方案3】:

感谢Ray的建议,我实现了以下:

CREATE FUNCTION [dbo].[fnGetRelevance] 
(   
    @fieldName nvarchar(50),
    @searchTerm nvarchar(50)
)

RETURNS  int
AS
BEGIN
    if (@fieldName like @searchTerm + '%') -- starts with
    begin       
        return 0
    end
    else if ((@fieldName like '%' + @searchTerm + '%') and (@fieldName not like @searchTerm + '%')) -- contains, but doesn't start with 
    begin       
        return 1
    end

    return 1
END

GO

这对 1 个较大的查询产生了以下性能影响:

【讨论】:

以上是关于如何先按搜索词排序查询结果,然后按字母顺序?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas str 按字母顺序然后按数字

首先按字母顺序对对象数组进行排序,然后按数字排序

Django - 如何在页面上更改搜索结果的排序顺序?

sql server 按字母顺序排序,然后是数字

按字母顺序对查询结果进行排序,但在排序中排除“the”?

Hadoop 二次排序