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

所以最后我的问题。我看不到第 1 行和第 2 行如何排在第 3 行之上,以及为什么第 3 行的排名与第 4 行相同。到目前为止,第 2 行应该具有最高排名,因为搜索字符串也与名字和姓氏匹配作为出生日期。

如果我将 OR 更改为 AND,我不会得到任何结果。

4

4 回答 4

6

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

我还发现我最好不要附加“*”。我认为它会出现更多匹配,但它往往会返回更差的结果(特别是对于长词)。作为中间立场,您可能只将 * 附加到较长的单词。

你给出的例子肯定很奇怪。

于 2008-11-26T23:07:02.607 回答
2

这并不完全等同,但也许我问的这个问题(如何:排名搜索结果)可能会有所帮助?

于 2008-11-27T22:33:22.363 回答
1

如果删除 DoB 标准会发生什么?

MS 全文搜索真的是一个难以理解和自定义的黑匣子 你几乎照原样接受它,不像 Lucene 非常适合自定义

于 2008-11-26T21:11:46.880 回答
1

谢谢你们。

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

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

My actual search string after converting it ended up being "Word1*" AND "Word2*"

Using the % sign still did not do what msdn said it should do. Meaning if I searched for the word josh and it got changed into "Josh%" when I searched then "Joshua" would not be found. Pretty dumb however with "Josh*" then joshua would be found.

于 2008-12-02T16:22:55.327 回答