0

我有一个允许用户搜索多个列的应用程序(prod_name,prod_desc)

所以我使用了如下的全文搜索,但它没有返回所有记录,例如,我试图在 2 列(prod_name,prod_desc)中找到 'o' 字符,但它无法找到某些记录。此外,当我不使用通配符作为 'o' 字符时,它在包含 %o% 之类的意思时找不到任何东西。我对全文搜索有点困惑。

请帮忙看看是什么问题。

CREATE FULLTEXT CATALOG catalog_crashcourse3;

CREATE FULLTEXT INDEX ON products(prod_name,prod_desc)
KEY INDEX pk_products ON catalog_crashcourse3;

SELECT prod_name, prod_desc
FROM products
WHERE CONTAINS((prod_name,prod_desc), '"*o*"');
4

2 回答 2

0

SQL Server FTS 是一个基于单词的搜索过程。当您在列上创建全文索引时,索引引擎会爬取内容并将其分解为单个单词,该过程称为标记化。然后索引存储了单词、找到它的行的主键以及单词在内容中的位置(即 is 是字段中的第一个单词、第 57 个单词或其他任何内容)。

当您指定一个 CONTAINS 谓词时,例如

CONTAINS((prod_name,prod_desc), '"o"');

SQL Server FTS 引擎在其索引中查找标记为“o”的标记(即单词)。如果您的内容中没有“o”一词(可能没有),则不会找到匹配项。

正如您所指出的,您可以进行通配符搜索,在其中尝试匹配索引词中的模式。例如,如果您指定一个谓词,例如

CONTAINS((prod_name,prod_desc), '"o*"');

然后搜索将返回索引内容中以字母“o”开头的所有单词

当您要在索引内容中搜索词组时,最好使用 FTS。它可以进行复杂的词干提取(例如在指定“run”时搜索“ran”和“running”)。它还提供搜索结果内容的排名,以便您找到最佳匹配。如果你只是想在你的内容中搜索一个指定的词,并且你的内容不是太大,你可能不需要 FTS。正如 MikeSmithDev 在评论中指出的那样,您也许可以摆脱 LIKE 子句。

补充说明:针对您的评论,如果您有一个包含 8 列的表,您想使用 FTS 进行搜索,那么您将在每个列上创建全文索引并按如下方式搜索它们:

CONTAINS(*, '"Word"')

其中星号表示表中的所有 8 个索引列都应包含在搜索中。

于 2012-11-14T15:26:46.823 回答
0

你有两个问题:

  1. 您正在使用*oSql Server FTS 无法使用的前缀通配符。它仅适用于后缀通配符,如word*.

  2. 您正在使用单字符搜索词。FT 索引中默认排除单字符词,这是一件好事。除非另有指定,否则 SQL Server在创建索引时默认关联系统全文非索引字表。

要查看您的数据库在背后使用的默认停止列表,请使用此查询

Select SysStop.stopword, Langs.name
From sys.fulltext_system_stopwords SysStop
    Inner Join sys.fulltext_languages Langs
    On Langs.lcid = SysStop.language_id;

如果您真的想搜索单个字符,您可以使用选项删除并重新创建 FT 索引WITH STOPLIST OFF,但要为大量噪音做好准备。请参阅创建全文索引

于 2013-09-14T18:00:03.243 回答