2011-06-07 87 views
4

我正在使用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 

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

+3

定义 “相关性”。 – 2011-06-07 10:08:03

+0

通过相关性,我的意思是他们希望被搜索的术语在排序中优先。第二个清单列出了进一步解释这个问题的一个例子。 – DaveDev 2011-06-07 10:10:31

+0

为什么大家都在引号中使用术语“相关性”?我写了'相关性'。我在这里错过了什么吗? – DaveDev 2011-06-07 10:21:23

回答

1

如果它是可以编写返回基于相关性的整数的函数,你可以做

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

你的功能就不会很复杂。它可以看看Field是否以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 

它不会是对你的表现虽然。

+0

谢谢雷,你的建议是实现一个函数的伎俩。我已经将它添加为性能结果的答案,如果您想查看:http://stackoverflow.com/questions/6263669/how-to-order-query-results-by-search-term-first-and - 然后按字母顺序/ 6267449#6267449 – DaveDev 2011-06-07 15:17:30

2

我从来没有在SQL或Linq中见过任何复杂的东西来搜索'相关性'。

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

我不知道是否有第三方.net库,可以具体量化相关性。

+0

如果您不希望查看数据库提供程序的全文搜索功能。 – 2011-06-07 10:18:36

1

多亏了雷人的建议下,我实现了以下内容:

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以下性能影响:

enter image description here

相关问题