全文搜索

问题描述:

我有一个应用程序,允许用户在全文搜索

所以我用全文检索像下面多列(PROD_NAME,prod_desc)搜索,但是它不返回所有的记录,为excample我试着在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*"'); 
+0

最好的办法是将此问题移至dba.stackexchange.com – NotMe

+0

什么是列数据类型?多少行? FULLTEXT是否需要在这里,或者你可以使用LIKE'%o%'? – MikeSmithDev

+0

prod_name(nchar(255)),prod_desc(ntext),我的行很多,我喜欢用作linq项目中的存储过程搜索按钮 – masoud

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"') 

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

+0

谢谢,我怎么不得不使用like(什么是最好的方式)当我想在表格的所有列(8列)中搜索特定单词时。 – masoud

+0

如果要搜索表中的所有8个索引列,请在CONTAINS谓词中为字段说明符使用星号。看到我上面的帖子,我修改了这个附加信息。谢谢。 –

你有两个问题:

  1. 您正在使用前缀通配符*o的SQL 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,但准备 有很多噪音。见Create FullText Index