有关SQL Server 2008全文搜索的问题

时间:2010-03-22 01:33:17

标签: sql-server-2008 full-text-search

我对SQL 2K8集成的全文搜索有一些疑问。

说我有以下表格:

  1. 带列的汽车:id(int - pk),makeid(fk),description(nvarchar),year(int),features(int - 按位值 - 仅32个特征)
  2. CarMake with columns:id(int - pk),mfgname(nvarchar)
  3. 包含列的CarFeatures:id(int - 1,2,4,8等),featurename(nvarchar)
  4. 如果有人搜索“红色本田civic 2002 4门”,我如何解析输入字符串,以便我也可以搜索“CarMake”和“CarFeatures”表?

1 个答案:

答案 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映射分解为一个单独的表。