在过去的几个小时里,我一直在搞乱SQL Server全文搜索的各种不同变体。但是我仍然无法弄清楚排名是如何运作的。我遇到过几个例子,让我觉得他们的排名高于其他人。例如
我有一个包含5个cols + more的表,没有编入索引。所有都是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”或“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,则不会得到任何结果。
答案 0 :(得分:6)
我发现AND和OR子句不适用于列。创建一个合并列的索引视图,您将获得更好的结果。查看我过去的问题,您将找到适合您的方案的信息。
我也发现我最好不要追加'*'。我认为它会出现更多的比赛,但它往往会带来更糟糕的结果(特别是对于长话)。作为一个中间立场,你可能只会在更长的单词上添加*。
你提供的示例案例肯定很奇怪。
答案 1 :(得分:2)
它不是完全等同于,但也许这个问题(How-to: Ranking Search Results)可能会有所帮助?
答案 2 :(得分:1)
如果删除DoB标准会怎样?
MS全文搜索真的是一个难以理解和定制的黑匣子 你几乎可以按原样使用它,不像Lucene非常适合定制
答案 3 :(得分:1)
谢谢你们。
弗兰克你是对的,AND和OR没有跨越列,这是我最初没有注意到的。
为了获得最佳效果,我必须在视图中将所有5列合并为1列。然后搜索该单个列。这样做给了我我想要的确切结果,没有任何额外的东西。
我转换后的实际搜索字符串最终为“Word1 *”和“Word2 *”
使用%符号仍然没有做msdn说它应该做的事情。这意味着如果我搜索单词josh并且当我搜索时它变成了“Josh%”,那么“Joshua”就找不到了。但是对于“Josh *”来说相当愚蠢,那么就会找到约书亚。