SQL Server全文搜索:如何获得完整列匹配

时间:2017-02-24 12:21:42

标签: sql sql-server full-text-search

我试图查找列值是参数的一部分的记录。

通常情况下,我会使用类似搜索,但这会慢一些。

数据:

1 | Jungle Road
2 | Long Road
3 | Small Road

SQL:

DECLARE @c nvarchar(512) = 'My Street: Jungle Road My Nr: 8'
SELECT Id, StreetName FROM Customers WHERE @c like '%' + StreetName + '%'

结果:

1 | Jungle Road

使用以下@c值' My Street:Jungle My Nr:8' (所以没有' Road')我没有得到任何记录(如预期的那样)。

但是因为喜欢慢,我试图使用全文搜索。

SELECT Id, StreetName FROM Customers WHERE FREETEXT(StreetName, @c)

结果@c ='我的街道:丛林之路我的身份:8':

1 | Jungle Road

现在有了@c'我的街:Jungle My Nr:8' (没有' Road')结果仍然是:

1 | Jungle Road

问题:

如何将全文搜索更改为完全匹配搜索而不是部分字搜索?所以当完整列值是参数的一部分时,我只得到一个结果?

我正在使用SQL Server 2012

2 个答案:

答案 0 :(得分:0)

试试这个:

CREATE TABLE #TEST (
ID INT IDENTITY PRIMARY KEY NOT NULL ,
StreetName NVARCHAR(512) NOT NULL
)
GO

INSERT INTO #TEST VALUES
('Jungle Road'),('Long Road'),('Small Road'),('My Street: Jungle Road My Nr: 8');

DECLARE @c nvarchar(512) = 'My Street: Jungle Road My Nr: 8';
SELECT Id, StreetName FROM #TEST WHERE @c like '%[' + StreetName + '%';

Resault:

Id          StreetName
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4           My Street: Jungle Road My Nr: 8

只是为了更多:

INSERT INTO #TEST VALUES
('My Street: Jungle Road My Nr: 8 bbbb');

DECLARE @c nvarchar(512) = 'My Street: Jungle Road My Nr: 8';
SELECT Id, StreetName FROM #TEST WHERE @c like '%[' + StreetName + '%';

故事:

Id          StreetName
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4           My Street: Jungle Road My Nr: 8
5           My Street: Jungle Road My Nr: 8 bbbb

答案 1 :(得分:0)

通常情况下,如果您希望结果为Jungle Road,但仅JungleRoad没有结果,您可以使用AND运算符进行FULLTEXT查询,如下所示:

DECLARE @c nvarchar(512) = '"Jungle" and "Road"'
SELECT Id, StreetName FROM Customers WHERE CONTAINS(StreetName, @c)

CONTAINSFREETEXT更准确,上述查询只返回包含Jungle和'道路'的记录。

但是,如果您能够从用户输入的搜索字符串中提取确切的搜索字词,它将仅适用于您,就像@SqlZim建议的那样。您必须通过将单个单词与and连接起来构建实际的FULLTEXT搜索字词,就像上面的@c变量一样。

如果您不希望/无法将用户输入拆分为搜索词,那么您最好的办法是按排名订购您的FULLTEXT查询结果,并让用户选择最匹配的客户端:

DECLARE @c nvarchar(512) = 'My Street: Jungle Road My Nr: 8'
WITH cte AS (
    SELECT [KEY],[Rank] from FREETEXTTABLE(Customers, StreetName, @c, 10)
) 
SELECT c.* from cte
    INNER JOIN Customers c on cte.[Key]=c.Id

FREETEXTTABLE 10的最后一个参数告诉SQL Server为您的搜索字符串@c选择TOP 10最佳匹配记录。

尝试用FREETEXTTABLE替换CONTAINSTABLE并查看差异。

HTH。