SQL Server全文搜索上的无关变形行为

时间:2016-05-24 11:11:57

标签: sql-server full-text-search

使用agarte在一个只有一行和一个只有一个单词的文本字段(例如CONTAINS)的表上搜索某些单词(例如te),SQL Server会将该行视为有效的结果。 (我正在寻找agartete有效吗?

我已经在不同服务器上的两个不同的SQL Server 2008和其他SQL Server 2012上进行了测试。

我认为与屈折形式有关但我无法理解为什么以及如何修改这种行为。

一个完整的可运行测试是:

SET NOCOUNT ON
GO
SELECT version = @@VERSION
GO
CREATE TABLE foo (k int identity(1,1), f nvarchar(max) not null, CONSTRAINT PK_foo PRIMARY KEY CLUSTERED (k ASC))
GO
INSERT INTO foo (f) VALUES ('te')
GO
CREATE FULLTEXT CATALOG foo_catalog
GO
CREATE FULLTEXT INDEX ON foo(f) KEY INDEX PK_foo ON foo_catalog WITH STOPLIST = OFF
GO
ALTER FULLTEXT CATALOG foo_catalog REBUILD WITH ACCENT_SENSITIVITY = OFF
GO
WAITFOR DELAY '00:00:05'
GO
SELECT COUNT(*) FROM foo WHERE CONTAINS(*, '"agarte"', language 3082) -- 1
SELECT COUNT(*) FROM foo WHERE CONTAINS(*, '"egarte"', language 3082) -- 1
SELECT COUNT(*) FROM foo WHERE CONTAINS(*, '"ogarte"', language 3082) -- 1
SELECT COUNT(*) FROM foo WHERE CONTAINS(*, '"garte"' , language 3082) -- 1
SELECT COUNT(*) FROM foo WHERE CONTAINS(*, '"gurte"' , language 3082) -- 0
GO
DROP FULLTEXT INDEX ON foo
GO
DROP FULLTEXT CATALOG foo_catalog
GO
DROP TABLE foo
GO

我将在搜索上设置中性语言作为解决方法,但我想了解为什么以及如何控制此行为。 THX!

1 个答案:

答案 0 :(得分:1)

问题似乎是wordbraker

如果我们运行

SELECT * FROM sys.dm_fts_parser (' "ugarte" ', 3082, 0, 0)

获取

keyword                    group_id phrase_id occurrence special_term display_term expansion_type source_term
-------------------------- -------- --------- ---------- ------------ ------------ -------------- -----------
0x0075006700610072         1        0         1          Exact Match  ugar         0              ugarte
0x00740065                 1        0         1          Noise Word   te           0              ugarte
0x007500670061007200740065 1        0         1          Exact Match  ugarte       0              ugarte

ogorte,其他人不会出现。

如果没有IFilter那么看起来不可能避免这个词。

相关信息: