浏览消息:信息性:全文搜索条件包含噪声词

时间:2014-05-19 18:01:25

标签: sql-server entity-framework

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

我有一个搜索页面(ASP .Net),它传递各种可搜索字段的值,并调用由Entity Framework 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                   

以下示例查询工作正常,但由于某些搜索项为空,因此返回信息性消息。真正的查询相当复杂,跨越多个表,并且构建动态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中回来了。在Entity Framework中,它会抛出一个错误。

有没有人解决这个问题?

我试图关闭停止列表

  

ALTER FULLTEXT INDEX ON地址SET STOPLIST = OFF

我尝试打开变换噪音字选项

  

sp_configure'转换干扰词',1;

     

RECONFIGURE;

1 个答案:

答案 0 :(得分:2)

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

然而,我确实解决了Entity Framework的问题,因为存储过程中有关它是如何被调用的错误。

从SSMS测试时,我们会像上面的参数一样调用proc。

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

因此,在使用默认值时,只有在未传递该参数的值时才会应用这些默认值。当您执行存储过程并为该参数传递显式null时,它不会采用默认值,并且将null传递给全文搜索,这会正确地引发错误。

那个DOH的另一个我忘了一刻。