症状:
搜索单个单词(即“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>
来解决我的问题。
为此,请按照以下步骤操作。
<off>
我必须这样做,因为我无法让transact SQL工作。它一直告诉我,没有像我试图修改的表那样的对象。如果有人能够提供有关Alter fulltext index
语句如何工作的任何见解,我很感兴趣,因为我在MSDN页面上跟随T的示例,它只是告诉我没有名为Product的对象。 / p>
答案 0 :(得分:0)
星号不是普通的旧通配符。如果您在搜索词结尾之外的任何地方使用它,则可能无法正确使用它。查看类似问题的答案
在您的情况下,每个搜索字词必须单独引用。请参阅文档http://technet.microsoft.com/en-us/library/ms187787(v=sql.90).aspx
中的此示例SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');