在过去的几个小时里,我一直在搞乱sql Server全文搜索的各种不同变体.但是我仍然无法弄清楚排名是如何运作的.我遇到过几个例子,让我觉得他们的排名高于其他人.例如
我有一个表有5个cols的表没有索引.所有都是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.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”或“JOHN *”或“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,则不会得到任何结果.
解决方法
我发现AND和OR子句不适用于列.创建一个合并列的索引视图,您将获得更好的结果.查看我过去的问题,您将找到适合您的方案的信息.
我也发现我最好不要追加’*’.我认为它会出现更多的比赛,但它往往会带来更糟糕的结果(特别是对于长话).作为一个中间立场你可能只会附加一个*更长的单词.
你提供的示例案例肯定很奇怪.