CONTAINSTABLE通配符在短语匹配时失败?

时间:2011-08-09 11:09:12

标签: sql tsql sql-server-2008

我有一个搜索查询,它接受用户键入的短语并应返回结果,这是一个示例:

SELECT rank,[KEY] FROM CONTAINSTABLE(tblproduct, (title,subtitle,publisher_name),  @search_text,15)

@search_text在哪里

Set @search_text = '"my favourite word*"'

这个短语目前是与数据库中的书籍完全匹配的标题。但是,通配符(*)使得它不会返回任何结果。

当我省略通配符时,我会得到一个精确的短语匹配,但是,其他一些短语,例如“The Imperfectionists”会在没有通配符的情况下返回任何结果。

这是为什么?我可以检查什么?

目前,如果没有为通配符生成结果集,我运行不带通配符的查询,看它是否返回任何内容。如果那也失败了,我会运行一个正常的“喜欢”声明。

显然,类似的声明将永远存在......而且我不想在一个拥有760万个数据库的数据库中使用它来进行应该使用全文的搜索......

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

使用JStead的建议,我查看了字符串的输出。我也在MSDN上发现了这个:

  

短语是什么时候,短语中包含的每个单词都是   被认为是一个单独的前缀。因此,一个查询指定一个   “local wine *”的前缀术语匹配任何具有“local”文本的行   酒庄“,”在当地喝酒和用餐“,等等。

因此,默认情况下,单词My被视为“噪音词”。添加*会导致解析器查找以My开头的任何单词。但是,在搜索索引时,单词My似乎已被删除(请记住,这是一个干扰词),因此它找不到匹配。

我正在考虑在添加*之前通过sys.dm_fts_parser函数运行我的搜索字符串,删除干扰词。

答案 1 :(得分:1)

有一个sys函数可以准确地告诉你微软将如何搜索你输入的术语。这将告诉你它要搜索的所有单词。使用以下

SELECT * FROM sys.dm_fts_parser (' "my favourite word*" ', 1033, 0, 0) 

有关此功能http://msdn.microsoft.com/en-us/library/cc280463.aspx

的更多信息

而不是使用*,您将需要更新同义词库,以便为您提供我喜欢的单词的所有可能变化。