我有一个搜索查询,它接受用户键入的短语并应返回结果,这是一个示例:
SELECT rank,[KEY] FROM CONTAINSTABLE(tblproduct, (title,subtitle,publisher_name), @search_text,15)
@search_text在哪里
Set @search_text = '"my favourite word*"'
这个短语目前是与数据库中的书籍完全匹配的标题。但是,通配符(*)使得它不会返回任何结果。
当我省略通配符时,我会得到一个精确的短语匹配,但是,其他一些短语,例如“The Imperfectionists”会在没有通配符的情况下返回任何结果。
这是为什么?我可以检查什么?
目前,如果没有为通配符生成结果集,我运行不带通配符的查询,看它是否返回任何内容。如果那也失败了,我会运行一个正常的“喜欢”声明。
显然,类似的声明将永远存在......而且我不想在一个拥有760万个数据库的数据库中使用它来进行应该使用全文的搜索......
任何帮助表示赞赏!
答案 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
的更多信息而不是使用*,您将需要更新同义词库,以便为您提供我喜欢的单词的所有可能变化。