SQL Server FTS为正确的关键字编制索引,但不使用这些关键字返回结果

时间:2019-07-06 09:45:12

标签: sql-server full-text-search freetext containstable freetexttable

我创建了一个FTS目录,该目录索引了名为Articles的表的Title列。断路器的语言设置为荷兰语。

文章标题为“ Contactgegevens Wijkteams 2019”。我的搜索词是“ contactgegevens”,该词的荷兰语是“ Contact details”。尽管我检查了已成功从正确的表/列中为整个单词建立索引的索引关键字,但该单词有可能被拆分为“ contact”和“ gegevens”。

搜索词:

declare @searchTerm nvarchar(100) 
select @searchTerm = 'contactgegevens';

使用自由文本:

如果我在where子句中使用FREETEXT,我会找到结果,但结果大约在300行的结尾处。大多数行在标题列中都没有这个词,甚至连词的含义都没有。

SELECT a.ArticleID, a.Title
FROM Articles a
WHERE
    FREETEXT(a.Title, @searchTerm))

使用FreeTextTable:

使用FREETEXTTABLE时,得到的结果要少得多,但是其中没有一个包含关键字:“ contactgegevens”或它的变体。

select * 
from 
    freetexttable(Articles, Title, @search, LANGUAGE N'Dutch', 100) as key_table
inner join 
    Articles a on a.ArticleID = key_table.[Key]
order by 
    key_table.RANK desc

使用ContainsTable:

CONTAINSTABLE似乎返回与FREETEXTTABLE非常相似的结果。

SELECT key_table.rank, a.*
FROM Articles a
INNER JOIN
    CONTAINSTABLE(Articles, Title, @searchTerm, LANGUAGE N'Dutch', 100) AS key_table on key_table.[KEY] = a.ArticleID 
WHERE
ORDER BY 
    key_table.rank DESC

如上所述,我已经使用以下查询检查了索引关键字:

select * 
from sys.dm_fts_index_keywords(DB_ID('MyDatabase'), OBJECT_ID('Articles'))
where (display_term like 'contactgegevens%') and column_id = 3
order by display_term

,并且为正确的表/列索引了该关键字,并查看了接近该结果的记录,我可以看到它与与正在寻找的文章标题相关的其他词已被索引。

我希望能够搜索诸如“ Contactgegevens Wijkteams 2019”之类的短语,并将具有该确切标题的文章显示在列表的顶部,但事实并非如此。在某些情况下,它根本不会出现在搜索结果中。

我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

原来这是我的一个简单错误。我的联接使用的是ArticleID而不是ArticleVersionID,后者是Catalog用作其唯一键,并且由key_table。[KEY]表示。

SELECT key_table.rank, a.*
FROM Articles a
INNER JOIN
    CONTAINSTABLE(Articles, Title, @searchTerm, LANGUAGE N'Dutch', 100) AS key_table on key_table.[KEY] = a.ArticleVersionID 
WHERE
ORDER BY 
    key_table.rank DESC