全文搜索不会在不同语言中返回一致的结果

时间:2018-01-17 10:45:24

标签: sql sql-server full-text-search sql-server-2016 stemming

我有一个Sql Server 2016数据库,在4列上定义了全文索引,每个列都配置了不同的语言:荷兰语,英语,德语和法语。我使用向导来设置全文索引。

我正在使用CONTAINSTABLEFORMSOF,对于每种语言,我希望使用词干或任何动词形式执行查询都会返回示例表中的两个结果。这似乎适用于英语和德语,有点用法语,而不是荷兰语。

我正在使用一个非常基本的例子,在每种语言中使用动词形式的'running',所以我认为可能没有正确配置某些内容。

示例表

+----+-------------+--------------+-----------------+----------------+
| ID | KeyWordsNL  |  KeyWordsEN  |   KeyWordsDE    |   KeyWordsFR   |
+----+-------------+--------------+-----------------+----------------+
|  1 | ik loop     | i run        | ich laufe       | je cours       |
|  2 | ik ga lopen | i am running | ich gehe laufen | je vais courir |
+----+-------------+--------------+-----------------+----------------+

英文查询

CONTAINSTABLE (SearchResult, KeyWordsEN, 'FORMSOF(INFLECTIONAL, "run")')
CONTAINSTABLE (SearchResult, KeyWordsEN, 'FORMSOF(INFLECTIONAL, "running")')

返回1&每个查询2个

德语查询

CONTAINSTABLE (SearchResult, KeyWordsDE, 'FORMSOF(INFLECTIONAL, "laufe")')
CONTAINSTABLE (SearchResult, KeyWordsDE, 'FORMSOF(INFLECTIONAL, "laufen")')

返回1&每个查询2个

法语查询

CONTAINSTABLE (SearchResult, KeyWordsFR, 'FORMSOF(INFLECTIONAL, "cours")')
CONTAINSTABLE (SearchResult, KeyWordsFR, 'FORMSOF(INFLECTIONAL, "courir")')

仅返回第一个查询中的记录1(cours),第二个查询返回1& 2

荷兰语查询

CONTAINSTABLE (SearchResult, KeyWordsNL, 'FORMSOF(INFLECTIONAL, "loop")')
CONTAINSTABLE (SearchResult, KeyWordsNL, 'FORMSOF(INFLECTIONAL, "lopen")')

仅在第一个查询(循环)中返回记录1,在第二个查询中记录2(lopen)

编辑:进一步测试...

可以使用sys.dm_fts_parser测试fts如何解析输入查询。这清楚地表明,“荷兰人”根本没有发生任何干扰。在不同的机器上测试过。

获得语言LCID:

select * from sys.fulltext_languages where name in ('Dutch','English','German','French')

select * from sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "koe")', 1043, 0, 0)

select * from sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "cow")', 1033, 0, 0)

荷兰语查询结果为“koe”,而英语查询结果为“cow's”,“cowed”,“cowing”,“cows”,“cows”,“cow”。

对于我尝试的每个单词都会出现同样的情况,荷兰语中没有任何单词的格式,而英语通常会返回5-10个单词形式。

1 个答案:

答案 0 :(得分:0)

我发现荷兰语(和其他语言)根本没有特定的词干库。它没有明确说明,但是this article解释了如何将断字器和词干恢复到以前的版本,并且看起来断字符和词干分析器实际上使用相同的dll。

以下查询显示荷兰语(LCID 1043)使用默认的中性语言分词/词干分析器,这解释了不良结果。

EXEC sp_help_fulltext_system_components 'wordbreaker';

获得每种语言的LCID:

SELECT * FROM sys.fulltext_languages;