扩展SQL Server全文索引以搜索外键
我知道一个SQL Server全文索引不能索引多个表。但是,我在要实现全文索引的表中有关系。
拿下面的3张桌子...
Vehicle Veh_ID - int (Primary Key) FK_Atr_VehicleColor - int Veh_Make - nvarchar(20) Veh_Model - nvarchar(50) Veh_LicensePlate - nvarchar(10) Attributes Atr_ID - int (Primary Key) FK_Aty_ID - int Atr_Name - nvarchar(50) AttributeTypes Aty_ID - int (Primary key) Aty_Name - nvarchar(50)
Attributes和AttributeTypes表包含可在正在构建的整个应用程序的下拉列表中使用的值。例如,"车辆颜色"的属性类型具有"黑色","蓝色","红色"等属性。
好的,因此当用户尝试搜索" Blue Ford Mustang"时就会出现问题。那么,考虑到Vehicle等表格会变得很大,最好的解决方案是什么?
我是否要在"车辆"表中创建另一个字段" Veh Color",该字段除了" FK Atr VehicleColor"外,还保留下拉菜单中所选内容的文本值?
或者,我是否完全删除" FK Atr VehicleColor"并添加" Veh Color"?当下拉列表以更新形式填充时,我可以使用" Veh Color"的文本值与" Atr Name"匹配。使用这种方法,我将不得不处理是否从数据库中删除了属性。
-注意:由于两个下划线之间的所有内容均以斜体显示,因此无法在代码视图之外使用下划线。
解决方案
据我了解(我已经使用过很多SQL Server,但从未使用过全文索引)SQL Server 2005允许我们针对视图创建全文索引。这样我们就可以在
SELECT Vehicle.VehID, ..., Color.Atr_Name AS ColorName FROM Vehicle LEFT OUTER JOIN Attributes AS Color ON (Vehicle.FK_Atr_VehicleColor = Attributes.Atr_Id)
然后跨此视图创建全文索引,包括索引中的" ColorName"。
我相信通常有一个单独的非规范化表专门用于全文本索引。然后,通过触发器或者本例中的SQL Server的计划任务来更新该表。
这是SQL Server2000。在SQL Server中,我们可以使用带全文索引的索引视图:http://msdn.microsoft.com/zh-cn/library/ms187317.aspx。但是请注意,索引视图有很多限制;例如,我们无法索引使用OUTER联接的视图。
我们可以创建一个视图,提取所需的任何数据,然后将全文索引应用于该视图。该视图需要使用" WITH SCHEMABINDING"选项创建,并且需要具有UNIQUE索引。
CREATE VIEW VehicleSearch WITH SCHEMABINDING AS SELECT v.Veh_ID, v.Veh_Make, v.Veh_Model, v.Veh_LicensePlate, a.Atr_Name as Veh_Color FROM Vehicle v INNER JOIN Attributes a on a.Atr_ID = v.FK_Atr_VehicleColor GO CREATE UNIQUE CLUSTERED INDEX IX_VehicleSearch_Veh_ID ON VehicleSearch ( Veh_ID ASC ) ON [PRIMARY] GO CREATE FULLTEXT INDEX ON VehicleSearch ( Veh_Make LANGUAGE [English], Veh_Model LANGUAGE [English], Veh_Color LANGUAGE [English] ) KEY INDEX IX_VehicleSearch_Veh_ID ON [YourFullTextCatalog] WITH CHANGE_TRACKING AUTO GO