扩展SQL Server全文索引以搜索外键

时间:2020-03-06 14:37:31  来源:igfitidea点击:

我知道一个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