2009-08-18 89 views
2

是否可以將CONTAINSTABLE和NOT關鍵字用於SQL Server全文搜索並排除單列包含要排除的值的行?在全文搜索和多列中使用NOT關鍵字

例如,讓我們採取以下索引視圖(簡化的用於說明此問題的目的):

ItemId INT 
FirstName VARCHAR(200) 
MiddleName VARCHAR(200) 
LastName VARCHAR(200) 
Address VARCHAR(1000) 
ChildrenNames TEXT 
SearchData TEXT 

SearchData不同於其它文本/ VARCHAR字段生成級聯字段。

這種看法,然後可以使用下面的查詢查找包含行進行搜索,但沒有姓氏:該查詢似乎

SELECT * 
FROM [v_MyView] V 
     LEFT OUTER JOIN CONTAINSTABLE 
     (
      [v_MyView], 
      (
      [FirstName], 
      [MiddleName], 
      [LastName], 
      [Address], 
      [ChildrenName], 
      [SearchData] 
     ), '"name" AND NOT "lastname"') FTS ON [FTS].[Key] = [V].[ItemId] 
WHERE (ISNULL(RANK,0) > 0) 

不返回正確的結果,因爲它會僅排除行,如果搜索字段的所有符合條件,而它應該排除ANY符合條件的行。

即。包含姓氏任何(單)列行應該從結果集被排除,而不是隻包含姓氏列(這將是行不太可能)。

唯一可用的選項似乎是檢查用戶查詢是否包含任何排除值(例如name -lastname),如果是,則限制查詢僅搜索'SearchData'列,因爲這是一個連接列並將包含所有數據。但是,這會影響相關性排名,似乎並不是一個好的解決方案。

回答

2

我遇到了同樣的問題,我懷疑這是SQL服務器中的一個錯誤。

我懷疑有人忘了!(A & B & C)===!A | !B | !C

現在,我將創建一個新列以存儲要搜索的所有行的連接,添加觸發器以在插入或更新數據時將所有文本添加到新列中,然後搜索一個新的專欄。

這使你的桌子正常化,但似乎瓶坯合理地好。

相關問題