全文搜索排名(SQL Server)

6

在过去的几个小时里,我一直在尝试各种不同变体的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,则无法获得任何结果。
4个回答

6

我发现AND和OR子句不适用于跨列。创建一个合并列的索引视图会得到更好的结果。查看我的过去问题,你会找到适合你的情况的信息。

我也发现不添加“*”会得到更好的结果。我以为它会返回更多的匹配,但它往往会返回较差的结果(特别是对于长单词)。作为一个折中方案,您可以只在较长的单词后面添加“*”。

你提供的示例确实很奇怪。


如何合并列并确保使用正确?我也遇到了同样的问题。 - zsharp
在编程中,是否将计算列与全文索引放在同一列中比在不同列中进行搜索更好? - user636525

2

1

如果删除出生日期的筛选条件会发生什么?

MS全文搜索真的是一个很难理解和定制的黑盒子,你基本上只能按原样使用,而Lucene非常适合定制。


1

谢谢大家。

Frank,你说得对,AND和OR不能跨列,这是我一开始没有注意到的。

为了获得最佳结果,我必须将所有5列合并成一个视图中的1列。然后在该单个列上进行搜索。这样做可以给我想要的精确结果,没有任何额外的东西。

我的实际搜索字符串在转换后最终变成了"Word1*" AND "Word2*"

使用百分号仍然无法做到msdn所说的那样。也就是说,如果我搜索单词josh并且它被更改为"Josh%",那么就无法找到"Joshua"。这很愚蠢,但是使用"Josh*",则可以找到joshua。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接