在过去的几个小时里,我一直在处理各种不同的 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
所以最后我的问题。我看不到第 1 行和第 2 行如何排在第 3 行之上,以及为什么第 3 行的排名与第 4 行相同。到目前为止,第 2 行应该具有最高排名,因为搜索字符串也与名字和姓氏匹配作为出生日期。
如果我将 OR 更改为 AND,我不会得到任何结果。