我有一个允许用户搜索多个列的应用程序(prod_name,prod_desc)
所以我使用了如下所示的全文搜索,但它没有返回所有记录,例如我试图找到' o' 2列中的字符(prod_name,prod_desc),但找不到某些记录。 此外,当我不使用通配符时,' 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*"');
答案 0 :(得分:0)
SQL Server FTS是一个基于单词的搜索过程。在列上创建全文索引时,索引引擎会对内容进行爬网,并在称为标记化的过程中将其分解为单个单词。索引然后存储单词,它找到的行的主键,以及单词在内容中的位置(即,是字段中的第一个单词,第57个单词,或其他)。
指定CONTAINS谓词时,例如
CONTAINS((prod_name,prod_desc), '"o"');
SQL Server FTS引擎在其索引中查找标记为“o”的标记(即单词)。如果您的内容中没有“o”(可能没有),则不会找到匹配项。
正如您所指出的,您可以进行通配符搜索,在其中尝试匹配索引字中的模式。例如,如果指定谓词,例如
CONTAINS((prod_name,prod_desc), '"o*"');
然后搜索将返回索引内容中以字母“o”
开头的所有单词当您要在索引内容中搜索单词组时,最好使用FTS。它可以执行复杂的词干(例如,当您指定“运行”时搜索“运行”和“运行”)。它还提供搜索结果内容的排名,以便您可以找到最佳匹配。如果您只想在内容中搜索指定的字词而且内容不是太大,则可能不需要FTS。正如MikeSmithDev在评论中指出的那样,你可能只能逃避LIKE条款。
注释已添加:在回复您的评论时,如果您要使用FTS搜索包含8列的表,则可以在每个列上创建全文索引并搜索它们如下:
CONTAINS(*, '"Word"')
其中asterik表示表中的所有8个索引列都应包含在搜索中。
答案 1 :(得分:0)
您有两个问题:
您使用的是Sql Server FTS所在的前缀通配符*o
无助的。它仅适用于word*
等后缀通配符。
您使用的是单字符搜索字词。单个字符的单词 默认情况下从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;
如果你真的想搜索单个字符,你可以删除和
使用选项WITH STOPLIST OFF
重新创建FT索引,但要做好准备
因为很多噪音。请参阅Create FullText Index。