我们使用SQL Server 2012 CONTAINSTABLE
全文搜索查询,我们希望找到某些字词:' noord',' oost',' zuid&# 39;,' west'。这个例子是针对荷兰语的,但问题不是语言特定的。
例如' noord'找不到,因为这是荷兰语系统停止列表中的一个单词。这是可以理解的。
因此,我们从系统停止列表中创建了一个自定义停止列表,并删除了有问题的停用词:' noord',' west'和' zuid'在这种情况下。
包含搜索字词' noord'现在产生结果,如预期的那样。不过搜索字词“西”'仍然没有结果。
尽管正确使用了自定义停止列表,但重建SQL Server的完整文本目录仍然会使用停用词' west'。为什么呢?
答案 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'不会导致额外的点击。