SQL 服务器 FTS 索引正确的关键字但不返回包含这些关键字的结果
SQL Server FTS indexing correct keywords but not returning results with those keywords
我创建了一个 FTS 目录,它索引了一个名为 Articles 的 table 的 Title 列。分词语言设置为荷兰语。
文章标题是"Contactgegevens Wijkteams 2019"。我的搜索词是 'contactgegevens',在荷兰语中表示 'Contact details'。这个词可能会被拆分成 'contact' 和 'gegevens',尽管我已经检查了已成功从正确的 table/column 中索引完整词的索引关键字。
搜索词:
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
似乎 return 与 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
并且该关键字已为正确的 table/column 编入索引,查看与此结果接近的记录,我可以看到它已编入与我要查找的文章标题相关的其他词的索引。
我希望能够搜索诸如 "Contactgegevens Wijkteams 2019" 之类的短语,并使具有该确切标题的文章出现在列表顶部,但事实并非如此。在某些情况下,它根本不会出现在搜索结果中。
我在这里错过了什么?
原来这是我的一个简单错误。我的加入使用的是 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
我创建了一个 FTS 目录,它索引了一个名为 Articles 的 table 的 Title 列。分词语言设置为荷兰语。
文章标题是"Contactgegevens Wijkteams 2019"。我的搜索词是 'contactgegevens',在荷兰语中表示 'Contact details'。这个词可能会被拆分成 'contact' 和 'gegevens',尽管我已经检查了已成功从正确的 table/column 中索引完整词的索引关键字。
搜索词:
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
似乎 return 与 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
并且该关键字已为正确的 table/column 编入索引,查看与此结果接近的记录,我可以看到它已编入与我要查找的文章标题相关的其他词的索引。
我希望能够搜索诸如 "Contactgegevens Wijkteams 2019" 之类的短语,并使具有该确切标题的文章出现在列表顶部,但事实并非如此。在某些情况下,它根本不会出现在搜索结果中。
我在这里错过了什么?
原来这是我的一个简单错误。我的加入使用的是 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