如何先按搜索词排序查询结果,然后按字母顺序?
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 个较大的查询产生了以下性能影响:
【讨论】:
以上是关于如何先按搜索词排序查询结果,然后按字母顺序?的主要内容,如果未能解决你的问题,请参考以下文章