我在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;
答案 0 :(得分:2)
因此,经过几天的搜索,我无法找到解决此消息的方法。
然而,我确实解决了Entity Framework的问题,因为存储过程中有关它是如何被调用的错误。从SSMS测试时,我们会像上面的参数一样调用proc。
存储过程具有未传递的参数的默认值。
因此,在使用默认值时,只有在未传递该参数的值时才会应用这些默认值。当您执行存储过程并为该参数传递显式null时,它不会采用默认值,并且将null传递给全文搜索,这会正确地引发错误。
那个DOH的另一个我忘了一刻。