Transact SQL CONTAINS不返回带有通配符

时间:2015-05-21 11:14:03

标签: sql-server

我在SQL Server 2008r2上遇到一个问题,即使用CONTAINS函数不会返回完全相同字符串的匹配项。我很确定我误解了有关CONTAINS的事情。

我已经设置了以下测试用例来复制它。

CREATE TABLE texttest
(
    loldex INT PRIMARY KEY IDENTITY,        
    testcolumn NVARCHAR(255)
)

GO

INSERT INTO texttest
VALUES('2ND ACADEMY OF NATURAL SCIENCES')

GO

CREATE UNIQUE INDEX ui_loldex ON [texttest](loldex);
CREATE FULLTEXT INDEX ON [texttest]([testcolumn])
KEY INDEX ui_loldex

CREATE FULLTEXT CATALOG ft AS DEFAULT;

GO

然后我运行以下查询:

SELECT [testcolumn]
FROM [texttest]
WHERE CONTAINS(testcolumn, '"2ND ACADEMY OF NATURAL SCIENCES*"')

它什么都不返回。

但是,如果我跑:

SELECT [testcolumn]
FROM [texttest]
WHERE CONTAINS(testcolumn, '"2ND ACADEMY*"')

返回行。

如果我在带有通配符的Y之后使用字符串中的任何其他字符,我什么也得不到。

如果我删除了通配符,我会从相同的字符串中获取该行。但是,我已尝试使用其他字符串的通配符,并且它工作正常。根据我的理解,通配符代表0个或更多的附加字符,所以我不明白为什么它在这种情况下不起作用。

知道我在这里缺少什么吗?

2 个答案:

答案 0 :(得分:1)

这是因为of是干扰词,如果您按stopwords搜索,则不会选择结果。你可以看到所有停用词:

select ssw.stopword, slg.name
  from sys.fulltext_system_stopwords ssw
  join sys.fulltext_languages slg on slg.lcid = ssw.language_id
where slg.name = 'English'  

您可以为桌子关闭它:

ALTER FULLTEXT INDEX ON [texttest] SET STOPLIST = OFF

您可以管理stoplistsstopwordshttps://technet.microsoft.com/en-us/library/ms142551(v=sql.110).aspx

例如:

stopword    name
must        English
my          English
never       English
no          English
now         English
of          English
on          English
only        English
or          English
other       English
our         English
out         English
over        English
re          English

答案 1 :(得分:0)

使用 freetext 功能在您的案例中搜索整个句子:

SELECT [testcolumn]
FROM [texttest]
WHERE freetext(testcolumn,'"2ND ACADEMY OF NATURAL SCIENCES*"')

输出:

testcolumn
2ND ACADEMY OF NATURAL SCIENCES