首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全文搜索

全文搜索
EN

Stack Overflow用户
提问于 2012-11-14 22:55:44
回答 2查看 252关注 0票数 0

我有一个允许用户在多个列(prod_name、prod_desc)上进行搜索的应用程序

所以我使用了全文搜索,如下所示,但它没有返回所有记录,例如,我试图在两列(prod_name,prod_desc)中查找'o‘字符,但对于某些记录找不到。另外,当我没有为'o‘字符使用通配符时,它找不到任何东西,而包含像%o%这样的意思。我对全文搜索有点困惑。

有什么问题,请帮帮忙。

代码语言:javascript
复制
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*"');
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-14 23:26:47

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

当您指定一个包含谓词时,如

代码语言:javascript
复制
CONTAINS((prod_name,prod_desc), '"o"');

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

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

代码语言:javascript
复制
CONTAINS((prod_name,prod_desc), '"o*"');

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

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

备注添加了:作为对您的评论的回应,如果您有一个包含8列的表,您要使用FTS搜索这些列,然后为每一列创建全文索引,并按如下方式进行搜索:

代码语言:javascript
复制
CONTAINS(*, '"Word"')

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

票数 0
EN

Stack Overflow用户

发布于 2013-09-15 02:00:03

您有两个问题:

  1. 您正在使用Sql Server FTS无能为力的前缀通配符*o。它只适用于后缀通配符,如word*.
  2. You使用单字符搜索词。默认情况下,单字符词被排除在FT索引之外,这是一件好事。除非另行指定,否则默认情况下,SQL Server在创建索引时会将系统全文非索引字表关联起来。

要查看数据库在后台使用的默认非索引字表,请使用以下查询

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13381242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档