【问题标题】:SQL Server Full-Text search fails when searching more than one word搜索多个单词时 SQL Server 全文搜索失败
【发布时间】:2013-05-29 22:24:00
【问题描述】:

症状:

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

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

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

设置:

具有高级功能的 SQL Server 2008 R2

nopCommerce 3.0

我做过的事情: 我在全文搜索目录中添加了 Product.MetaKeywords 列

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

现在 nopCommerce 板相当慢,但我很肯定问题出在 SQL 存储过程中,所以我想我会在这里寻求一些 SQL Server 帮助,即使你不熟悉 nopCommerce 网络应用程序,您可能有一些信息可以帮助我。

有问题的存储过程太大而无法在此处完整发布,但基本上它会在关键字搜索之间动态添加“OR”或“AND”以生成包含子句中使用的短语。它使用 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>

我不得不这样做,因为我无法让事务 SQL 工作。它一直告诉我没有像我试图修改的表这样的对象。如果有人可以提供有关Alter fulltext index 语句如何工作的任何见解,我很感兴趣,因为我正在按照 MSDN 页面上的示例到 T 并且它只是一直告诉我没有名为 Product 的这样的对象。

【问题讨论】:

  • 你能试试 '"Snap*" OR "On*"'(引用每个词,所以 OR 不被视为搜索词的一部分)

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


【解决方案1】:

星号不是普通的旧通配符。如果您在搜索词末尾以外的任何地方使用它,那么您可能没有正确使用它。查看类似问题的答案

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

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多