绕过消息:提示:全文搜索条件包含噪声词



我在SQLServer 2008 R2中使用全文搜索来加速当前使用LIKE '%searchTerm%'的查询处理。

我有一个搜索页面(asp.net),它传递各种可搜索字段的值,并调用由实体框架4.5执行的存储过程。

问题是,当您使用带有空谓词的全文搜索函数(freetext, contains等)时,SQLServer会生成一条信息消息。

是否有一种方法可以让实体框架忽略信息消息并获得结果?

这似乎是全文搜索的一个常见问题,我还没有找到一种方法来关闭它。

这个场景是一个基本的地址表:

    CREATE TABLE [Address](
    [AddressID] [int] IDENTITY(0,1) NOT NULL,
    [HouseNumber] [varchar](8) NULL,
    [AddressLine1] [varchar](40) NULL,
    [AddressLine2] [varchar](40) NULL,
    [City] [varchar](20) NULL,
    [StateCode] [char](2) NOT NULL,
    [ZipCode] [char](10) NULL,
    [ApartmentNumber] [varchar](8) NULL,
 CONSTRAINT [PK_NewBuilding] PRIMARY KEY CLUSTERED (
    [AddressID] ASC )

表上有一个全文索引

    CREATE FULLTEXT INDEX ON Address
(
    HouseNumber                      
        Language 1033,            
    AddressLine1
        Language 1033,
    AddressLine2
        Language 1033,
    City
        Language 1033,
    ZipCode
        Language 1033
)
KEY INDEX PK_NewBuilding ON AddressSearchCatalog
WITH CHANGE_TRACKING AUTO                   

下面的示例查询工作正常,但由于某些搜索条件为空,因此返回Informational Message。真正的查询相当复杂,跨越多个表,构建动态SQL查询将是一场噩梦。

    declare @pBuildingHouseNumber nvarchar(8) = N'""', 
    @pStreet nvarchar(30) = N'"Williams"',
    @pCity nvarchar(20)= N'""',
    @pZipCode nchar(10) = N'""'
select HouseNumber,AddressLine2,City,StateCode,ZipCode
from Building 
where 
    (@pBuildingHouseNumber = '""' OR CONTAINS(HouseNumber, @pBuildingHouseNumber) ) and
    (@pStreet = '""' OR FREETEXT((AddressLine2,AddressLine1), @pStreet) ) and
    (@pCity = '""' OR CONTAINS(City, @pCity) ) and
    (@pZipCode = '""' OR CONTAINS(ZipCode, @pZipCode) ) 
    option (recompile)

查看SSMS中的消息窗口,我得到

Informational: The full-text search condition contained noise word(s).
(49 row(s) affected)

但是结果集确实返回到SSMS中。在实体框架中,它抛出一个错误。

有人解决了这个问题吗?

我已经尝试关闭停止列表

ALTER FULLTEXT INDEX ON Address SET stopplist = OFF

我试过打开变换噪声单词选项

sp_configure 'transform noise words', 1;

重新配置;

因此,经过几天的搜索,我无法找到关闭此消息的方法。

我确实修复了实体框架的问题,因为这是存储过程中关于如何调用它的错误。

在从SSMS进行测试时,我们将调用与上述参数类似的过程。

存储过程对未传递的参数具有默认值。

当使用默认值时,那些默认值只会在你不为那个参数传递值时被应用。当您执行存储的过程并为该参数显式传递null时,它不会采用默认值,并且将null传递给全文搜索,这将正确抛出错误。

又一个我忘记的DOH时刻。

最新更新