2010-03-22 79 views
3

我對SQL 2K8集成全文搜索有一些疑問。有關SQL Server 2008全文搜索的問題

說我有如下表:

  1. 汽車與列:ID(INT - PK),makeid(FK),描述(NVARCHAR),一年(INT),功能(INT - 按位值 - 只有32個功能)
  2. CarMake與列:ID(INT - PK),mfgname(NVARCHAR)
  3. CarFeatures與列:ID(INT - 1,2,4,8,等),featurename(NVARCHAR)

如果有人搜索「紅色本田civic 2002 4門」,我將如何解析輸入字符串,以便我還可以在「CarMake」和「CarFeatures」表中進行搜索?

+1

@Eddit:記下標籤的變化。你寫的不是標籤如何工作。 – 2010-03-22 01:36:29

+1

謝謝約翰 - 這裏的第一個計時器... – Eddie 2010-03-22 01:38:24

回答

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和門',從而在2004年找到具有2門或4WD和2門的車型。另外,我沒有在你的模式中看到顏色,所以我不確定這將如何進入混合。

顯然要強制用戶將搜索條件分解爲其組成部分顯然要簡單得多,而不是試圖實施谷歌搜索。因此,您將限制用戶從下拉列表中選擇顏色,從另一個下拉列表中選擇製作等等。如果你這樣做了,那麼你將不需要上面提到的視圖,而是可以對錶中的列進行查詢。

順便說一下,特徵列是一個按位值,因此您需要對每個值執行按位與運算,以確定它是否具有該特徵。將Feature to Car映射到單獨的表中將會更好。

+0

托馬斯, 感謝您的答覆。我接下來的第二個選擇與上面的第二個建議類似,即有一個搜索頁面,要求用戶提供特定的標準(非Google搜索)。 我會嘗試你的建議:創建一個視圖,索引它(不知道FTS可以索引視圖),並在其上運行FTS。 這也是一個好主意,可以分離功能到汽車的映射表。這種方式的特徵數可以與行數一樣多(不限於列類型的位數)。 再次感謝! – Eddie 2010-03-22 03:10:53

+0

如果你能夠將搜索分解爲其組成部分,它將避免全文搜索的需要,並且會比我提出的視圖快幾個數量級。 – Thomas 2010-03-22 04:41:20

+0

順便說一句,如果我的回答有幫助,不要忘記將問題標記爲已回答。 – Thomas 2010-03-22 04:43:17