搜索多个单词时,SQL Server全文搜索失败

时间:2013-06-03 17:21:56

标签: stored-procedures sql-server-2008-r2 nopcommerce

症状:

搜索单个单词(即“Snap”)有效

搜索同一字段中包含的另一个字(即“开”)也可以

同时搜索“Snap On”会返回0结果,即使它不应该。

设置:

具有高级功能的SQL Server 2008 R2

nopCommerce 3.0

我做过的事情: 我将Product.MetaKeywords列添加到全文搜索目录

我在存储过程中添加了一点,执行搜索以搜索MetaKeywords

现在nopCommerce主板相当慢,但我很肯定问题是在SQL存储过程中,所以我想我会在这里要求一些SQL Server帮助,即使你不熟悉nopCommerce web应用程序,您可以获得一些可以帮助我的信息。

有问题的存储过程太大而无法完全发布,但基本上它会在关键字搜索之间动态添加“OR”或“AND”以生成Contains子句中使用的短语。它使用Contains通过几个联合选择各种可搜索的字段。

这是我添加到存储过程中的位

SET @sql = @sql + '
UNION
SELECT p.Id
FROM Product p with (NOLOCK)
WHERE '
IF @UseFullTextSearch = 1
    SET @sql = @sql + 'CONTAINS(p.[MetaKeywords], @Keywords) '
ELSE
    SET @sql = @sql + 'PATINDEX(@Keywords, p.[MetaKeywords]) > 0 '

@Keywords,此时,如果我正确阅读了该程序,则其值为:"Snap* AND On*"

我不明白为什么我的“Snap On”查询返回0结果,但“Snap”和“On”单独工作正常。

最小搜索长度设置为1,所以不是这样。

我应该补充说,搜索"Snap* OR On*"有效,但我不能使用OR,因为搜索“Snap On”也会返回“Snap Dragon”和其他无关的内容。

- 编辑 -

问题不在于此。我在其他地方得到了一些建议,问题实际上是停止列表。我设法通过将产品表上的停止列表从<system>更改为<off>来解决我的问题。

为此,请按照以下步骤操作。

  • 在SQL Server管理工作室中浏览到您的表
  • 右键单击表格并选择“全文索引”
  • 选择“全文索引”下的“属性”
  • 在“常规”标签中,将“全文索引停止列表”更改为<off>

我必须这样做,因为我无法让transact SQL工作。它一直告诉我,没有像我试图修改的表那样的对象。如果有人能够提供有关Alter fulltext index语句如何工作的任何见解,我很感兴趣,因为我在MSDN页面上跟随T的示例,它只是告诉我没有名为Product的对象。 / p>

1 个答案:

答案 0 :(得分:0)

星号不是普通的旧通配符。如果您在搜索词结尾之外的任何地方使用它,则可能无法正确使用它。查看类似问题的答案

SQL Contains Question

在您的情况下,每个搜索字词必须单独引用。请参阅文档http://technet.microsoft.com/en-us/library/ms187787(v=sql.90).aspx

中的此示例
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');