我对SQL 2K8集成的全文搜索有一些疑问。
说我有以下表格:
如果有人搜索“红色本田civic 2002 4门”,我如何解析输入字符串,以便我也可以搜索“CarMake”和“CarFeatures”表?
答案 0 :(得分:2)
尝试解析这样的搜索条件会很痛苦。一种可能的替代解决方案是创建一个视图,该视图创建汽车的长描述并在其上创建全文索引。因此该视图可能如下所示:
Create View dbo.CarData
WITH SCHEMABINDING
As
Select dbo.Cars.Id
, dbo.CarMake.Manufactuer
+ ' ' + dbo.Cars.[Year]
+ Coalesce(' ' + dbo.Cars.Description,'')
+ ' ' + Case When Features & 1 <> 0 Then (Select Name From dbo.CarFeature Where Id = 1) Else '' End
+ ' ' + Case When Features & 2 <> 0 Then (Select Name From dbo.CarFeature Where Id = 2) Else '' End
+ ' ' + Case When Features & 4 <> 0 Then (Select Name From dbo.CarFeature Where Id = 4) Else '' End
+ ' ' + Case When Features & 8 <> 0 Then (Select Name From dbo.CarFeature Where Id = 8) Else '' End
+ ' ' + Case When Features & 16 <> 0 Then (Select Name From dbo.CarFeature Where Id = 16) Else '' End As Description
From dbo.Cars
Join dbo.CarMake
On CarMake.Id = Cars.MakeId
在该视图上使用全文索引,然后您可以采用搜索条件并执行:
Select ...
From CarData
Where Contains(Description, Replace('red honda civic 2002 4 doors', ' ', ' AND '))
现在,这远非完美。例如,它将导致'... 4 AND门',从而在2004年找到2门或4WD和2门的车型。另外,我没有在你的架构中看到颜色,所以我不确定它是如何融入混合的。
迫使用户将搜索条件分解为其组成部分而不是尝试实现类似Google的搜索显然会更加简单。因此,您可以限制用户从下拉列表中选择颜色,从另一个下拉列表中选择make等等。如果你这样做,那么你就不需要上面提到的View,而是可以查询表中的列。
顺便说一句,功能列是一个按位值会使搜索更加困难,因为您需要对每个值执行按位AND运算以确定它是否具有相关功能。最好将Feature to Car映射分解为一个单独的表。