我有一个允许用户在多个列(prod_name、prod_desc)上进行搜索的应用程序
所以我使用了全文搜索,如下所示,但它没有返回所有记录,例如,我试图在两列(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*"');发布于 2012-11-14 23:26:47
SQL Server FTS是一个基于单词的搜索过程。在列上创建全文索引时,索引引擎将对内容进行爬网,并在称为标记化的过程中将其分解为单独的单词。然后,索引存储单词、找到它的行的主键以及单词在内容中的位置(即,is是字段中的第一个单词、第57个单词或其他任何单词)。
当您指定一个包含谓词时,如
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个索引列都应包含在搜索中。
发布于 2013-09-15 02:00:03
您有两个问题:
*o。它只适用于后缀通配符,如word*.要查看数据库在后台使用的默认非索引字表,请使用以下查询
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。
https://stackoverflow.com/questions/13381242
复制相似问题