我在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时刻。