在过去的几个小时里,我一直在尝试各种不同变体的SQL Server全文搜索。但是我仍然无法弄清楚排名的工作原理。我遇到了一些例子,让我感到困惑,因为它们的排名比其他人高。例如:
我有一个带有5个列+更多未索引的表格。所有字段都是nvarchar
类型。
我正在运行此查询(嗯,几乎是这样…我用不同的名称重新输入)
SET @SearchString = REPLACE(@Name, ' ', '*" OR "') --Splits words with an OR between
SET @SearchString = '"'+@SearchString+'*"'
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;
因此,如果我搜索11/05/1964 JOHN JACKSON,我将得到"11/05/1964" OR "JOHN*" OR "JACKSON*" 的结果,以下是这些结果:
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
所以最后我的问题是:我不明白为什么第一行和第二行的排名高于第三行,也不明白为什么第三行的排名与第四行相同。第二行应该远远比其他行的排名高,因为搜索字符串匹配了名字、姓氏和出生日期。
如果我将OR更改为AND,则无法获得任何结果。