为什么SQL Server 2012会应用我们的自定义停止列表中不存在的停用词?

时间:2015-12-06 08:31:45

标签: sql-server

我们使用SQL Server 2012 CONTAINSTABLE全文搜索查询,我们希望找到某些字词:' noord',' oost',' zuid&# 39;,' west'。这个例子是针对荷兰语的,但问题不是语言特定的。

例如' noord'找不到,因为这是荷兰语系统停止列表中的一个单词。这是可以理解的。

因此,我们从系统停止列表中创建了一个自定义停止列表,并删除了有问题的停用词:' noord',' west'和' zuid'在这种情况下。

包含搜索字词' noord'现在产生结果,如预期的那样。不过搜索字词“西”'仍然没有结果。

尽管正确使用了自定义停止列表,但重建SQL Server的完整文本目录仍然会使用停用词' west'。为什么呢?

1 个答案:

答案 0 :(得分:1)

简而言之,这似乎是由其他停止词引起的:' zuidzuidwest'和' westzuidwest'。 SQL-Server应用了一些分裂机制,导致' west'仍然是一个停止的词。可能它使用了断字符,或者它应用系统停止列表来拆分自定义停止列表中的单词。

所采取的措施是删除停用词&zhuidzuidwest'和' westzuidwest'来自自定义停止列表。这解决了这个问题。

下面是一些细节。

可以使用以下查询建立单词是否在系统停止列表中。

SELECT * FROM sys.fulltext_system_stopwords WHERE language_id=1043
AND stopword IN ('noord', 'oost', 'zuid', 'west');

这会产生

noord  1043
west   1043
zuid   1043

从系统停止列表中创建自定义停止列表:

CREATE FULLTEXT STOPLIST CustomStoplist FROM SYSTEM STOPLIST;

建立停止列表ID:

SELECT * FROM sys.fulltext_stoplists;

产量(在这种情况下)停止列表ID 6将在下面的查询中使用。删除有问题的停用词:

ALTER FULLTEXT STOPLIST CustomStoplist DROP 'noord' LANGUAGE 1043;
ALTER FULLTEXT STOPLIST CustomStoplist DROP 'west' LANGUAGE 1043;
ALTER FULLTEXT STOPLIST CustomStoplist DROP 'zuid' LANGUAGE 1043;

以下查询显示SQL-Server仍将过滤' zuid'和' west':

SELECT * FROM sys.dm_fts_parser('"noord" or "oost" or "zuid" or "west"', 1043, 6, 0);

这表明' zuid'和' west'尽管从自定义停止列表中删除了单词,但仍然是噪音词。

Exact Match  noord
Exact Match  oost
Noise Word   zuid
Noise Word   west

采取上述措施:

ALTER FULLTEXT STOPLIST CustomStoplist DROP 'zuidzuidwest' LANGUAGE 1043;
ALTER FULLTEXT STOPLIST CustomStoplist DROP 'westzuidwest' LANGUAGE 1043;

重复dm_fts_parser查询:问题已解决。

为了找到可能会干扰的所有组成单词:

SELECT * FROM sys.fulltext_stopwords WHERE stoplist_id=6
AND language_id=1043
AND (stopword LIKE '%noord%' OR stopword LIKE '%oost%'
OR stopword LIKE '%zuid%' OR stopword LIKE '%west%');

产量例如' zuidwest'和' zuidzuidoost'。确保这些单词也可以从自定义停止列表中删除。

为了完整性搜索查询。请注意,无法运行此查询,因为表内容和列Nr和Title是特定于应用程序的。

SELECT c.Nr, c.Title FROM CONTAINSTABLE(Contents, (Title),
'"noord" or "oost" or "zuid" or "west"') x JOIN Contents c
ON x.[KEY]=c.Nr ORDER BY c.Nr;

查询产生一定数量的命中。放弃停止词后,zuidzuidwest'命中数增加,这是最初的目标。在删除了停止词' westzuidwest'点击次数增加甚至更多。之后再删除“zuidwest'不会导致额外的点击。