SQL 服务器全文搜索的外来变形行为
Extraneous inflection behavior on SQL Server full-text search
在只有一行和一个文本字段只有一个词的 table 上使用 CONTAINS
搜索某些词(例如 agarte
)(例如 te
), SQL 服务器发现该行是有效结果。 (我正在寻找 agarte
而 te
有效吗?)
我在不同的服务器上测试了两个不同的 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
我将在搜索中设置中性语言作为解决方法,但我想了解为什么以及如何控制此行为。谢谢!
问题看起来是 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
看起来不可能避免断字。
相关信息:
在只有一行和一个文本字段只有一个词的 table 上使用 CONTAINS
搜索某些词(例如 agarte
)(例如 te
), SQL 服务器发现该行是有效结果。 (我正在寻找 agarte
而 te
有效吗?)
我在不同的服务器上测试了两个不同的 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
我将在搜索中设置中性语言作为解决方法,但我想了解为什么以及如何控制此行为。谢谢!
问题看起来是 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
看起来不可能避免断字。
相关信息: