2013-04-01 115 views
1

對不起,但我不能總結這更好。跨欄目全文搜索

最好使用一個例子。假設我有兩個文本列這個簡單的表(我將其他列刪除)。

Id Text_1 Text_2 
1  a  a b 
2  c  a b 

現在,如果我想搜索'「a」而不是「b」',在我目前的實現中,我獲得了記錄1。我明白這是爲什麼,這是因爲搜索條件與列「Text_1」匹配,而記錄2則不匹配任何列。

但是,對於最終用戶來說,這可能並不直觀,因爲它們可能意味着大部分時間都不包括記錄1。所以我的問題是,如果我想告訴SQL Server執行匹配「跨所有列」(即如果在任何列上找到「NOT」部分,記錄不應匹配),是嗎?可能?

編輯:這是我的查詢將是什麼樣子的這個例子:

SELECT Id, TextHits.RANK Rank, Text_1, Text_2 FROM simple_table 
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a" and not "b"') TextHits 
ON TextHits.[KEY] = simple_table.Id 
ORDER BY Rank DESC 

的實際查詢是一個比較複雜一點(多列,多連接等),但這是一般的想法:)

謝謝!

+2

@xurumunga。 。 。你能提供一個你正在使用的當前代碼的例子,你認爲這不正確嗎?而且,將數據庫作爲標籤包括在內也很重要,因爲不同的數據庫對於搜索文本具有不同的優勢。 –

+0

感謝@Gordon的建議。我添加了查詢和標籤。 – xurumanga

+0

有一百萬個不同的例子,這是似乎重複的副本:http://stackoverflow.com/questions/1796506/search-all-tables-all-columns-for-a-specific-value-sql-服務器 – RandomUs1r

回答

1

邏輯將針對每條記錄進行評估,因此如果您希望從一行中的一條記錄中排除命中以導致排除行,您應該使用NOT EXISTS並將fullText查詢分解爲單獨的包含和排除零件...

SELECT Id, 
     TextHits.RANK Rank, 
     Text_1, 
     Text_2 
FROM simple_table 
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a"') TextHits 
     ON TextHits.[KEY] = simple_table.Id 
WHERE NOT EXISTS (SELECT 1 
        FROM CONTAINSTABLE(simple_table, (Text_1, Text_2), '"b"') exclHits 
        WHERE TextHits.[KEY] = exclHits.[KEY]) 
ORDER BY Rank DESC 
+0

謝謝@ Love2Learn。就像RandomUs1r也建議的那樣,似乎做後排步驟是我需要做的。我只需要考慮一下,因爲我需要支持的不僅僅是「a」而不是「b」,而且我不想過度複雜化查詢。我希望它能夠工作。當我有機會嘗試時,我會回覆。 – xurumanga

+0

這種方法取得了訣竅。我們結束了一些稍有不同,但幾乎相同的東西;而不是做WHERE NOT EXISTS我們結束了WHERE ID NOT IN(SELECT exclHits。[KEY] FROM CONTAINSTABLE(...))。歡呼所有:) – xurumanga

+0

從查詢計劃的角度來看,您也可以執行'NOT EXISTS'並將WHERE TextHits [KEY] = exclHits。[KEY]'更改爲'WHERE simple_table。Id = exclHits。[KEY]',但是從查詢計劃的角度來看,它應該是同樣的事情。很高興爲你工作。 –