2008-11-25 111 views
6

在过去的几个小时里,我一直在讨论SQL Server全文搜索的各种不同变体。不过,我仍然无法弄清楚排名如何运作。我遇到了一些让我困惑的例子,他们的排名高于其他人。例如全文搜索排名(SQL Server)

我有一张表,5列+更多没有索引。全部是nvarchar字段。

我运行此查询

SET @SearchString = REPLACE(@Name, ' ', '*" OR "') --Splits words with an OR between 
SET @SearchString = '"'[email protected]+'*"' 
print @SearchString; 

SELECT ms.ID, ms.Lastname, ms.DateOfBirth, ms.Aka, ms.Key_TBL.RANK, ms.MiddleName, ms.Firstname 
FROM View_MemberSearch as ms 
INNER JOIN CONTAINSTABLE(View_MemberSearch, (ms.LastName, ms.Firstname, ms.MiddleName, ms.Aka, ms.DateOfBirth), @SearchString) AS KEY_TBL 
    ON ms.ID = KEY_TBL.[KEY] 
WHERE KEY_TBL.RANK > 0 
ORDER BY KEY_TBL.RANK DESC; 

因此(嗯..几乎与我不同的名字重新输入),如果我搜索1964年11月5日JOHN JACKSON我会得到“11/05/1964" 年OR “约翰*” 或 “杰克逊*”这些结果:

ID -- First Name -- Middle Name -- Last Name -- AKA -- Date of Birth -- SQL Server RANK 
---------------------------------------------------------------------------------- 
1 | DAVE  | JOHN  | MATHIS  | NULL | 11/23/1965 | 192 
2 | MARK  | JACKSON  | GREEN  | NULL | 05/29/1998 | 192 
3 | JOHN  | NULL  | JACKSON | NULL | 11/05/1964 | 176 
4 | JOE  | NULL  | JACKSON | NULL | 10/04/1994 | 176 

所以最后我的问题。我没有看到第1行和第2行是如何排在第3行之上的,以及为什么第3行的排名与第4行相同。第2行应该具有最高的排名,因为搜索字符串与First name和Last Name匹配作为出生日期。

如果我将OR更改为AND我没有得到任何结果。

回答

6

我发现AND和OR子句别跨栏应用。创建一个合并列的索引视图,你会得到更好的结果。看看我过去的问题,你会发现适合你的场景的信息。

我也发现我最好不要追加'*'。我认为它会出现更多的比赛,但它往往会返回更糟的结果(特别是对于长单词)。作为一个中间地带,你可能只会在*后加上更长的单词。

你给出的例子绝对是奇怪的。

+0

如何合并列并准确使用?我有同样的问题。 – zsharp 2009-12-11 06:01:00

1

如果您删除DoB标准会发生什么?

MS全文搜索确实是一个真正的黑盒子,很难理解和定制 你几乎把它原样,不像Lucene是伟大的定制

1

谢谢你们。

弗兰克你是正确的,AND和OR不跨栏这是我一开始没有注意到的东西。

为了获得最佳效果,我必须将所有5列合并到一个视图中的1列中。然后搜索该列。这样做给了我想要的确切结果,而无需任何额外费用。转换后

我实际的搜索字符串,它结束了“字1 *”和“字2 *”

使用%符号仍然没有做什么的MSDN说,它应该做的。这意味着如果我搜索了单词josh,并且当我搜索时它变成了“Josh%”,那么找不到“Joshua”。然而,当“Josh *”很愚蠢时,约书亚就会被找到。