2012-06-23 98 views
3

有沒有一種方法可以將此全文搜索查詢從MySQL轉換爲SQL Server?MySQL MATCH()AGAINST()等價於SQL Server

SELECT *, MATCH(title) AGAINST('My Title' IN BOOLEAN MODE) AS score FROM books 
WHERE MATCH(title) AGAINST('My Title' IN BOOLEAN MODE) ORDER BY score DESC, 
books.title ASC 

如果有幫助,我特別使用SQL Server 2000.我沒有使用更新版本的選項。 :S

以下是一個示例場景。


創建該表:

-- 
-- Table structure for table `books` 
-- 

CREATE TABLE IF NOT EXISTS `books` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `title` (`title`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 

-- 
-- Index the title column 
-- 

ALTER TABLE `books` ADD INDEX (`title`) 

-- 
-- Dumping data for table `books` 
-- 

INSERT INTO `books` (`id`, `title`) VALUES 
(1, 'My Title'), 
(2, 'My Title'), 
(3, 'Not My Title'), 
(4, 'Other Title'), 
(5, 'Not Related'), 
(6, 'Not Related Either'); 

執行查詢:

SELECT *, MATCH(title) AGAINST('My Title' IN BOOLEAN MODE) AS score FROM books 
WHERE MATCH(title) AGAINST('My Title' IN BOOLEAN MODE) ORDER BY score DESC, 
books.title ASC 

這裏是返回什麼:

id title   score 
1 My Title  1 
2 My Title  1 
3 Not My Title 1 
4 Other Title  1 

謝謝您的時間。

+0

爲了我們這些瞭解SQL Server但不知道MySQL的人的利益,你能解釋一下'MATCH()AGAINST()'的用法嗎?最好用一個例子 - 樣本數據和期望的結果。這看起來像是在全文搜索之後,但這只是查詢中的猜測。 –

+0

沒問題。 MATCH()在MySQL表中獲取索引列,並與傳入AGAINST()的字符串進行匹配。它不會像'column ='string''那樣尋找等價的字符串,但它會返回類似的結果。它也比'LIKE%string%'更有用。按「分數」別名排序允許與字符串最密切相關的結果首先顯示。這裏是我教我如何編寫查詢以進行全文搜索的文章:http://devzone.zend.com/26/using-mysql-full-text-searching/ –

+0

@AaronBertrand我已經更新了問題與樣品。是的,這是全文搜索。 –

回答

2

這絕對聽起來像是實施全文搜索的情況。這聽起來像你之後的算法比CHARINDEX,PATINDEXLIKE提供的算法複雜得多,這些非常簡單的開/關類型結果(字符串包含搜索的表達式,或者它不包含)。

SQL Server 2000中全文搜索的官方Microsoft文檔starts hereThis white paper may also be useful,以及此MSDN文章,"10 Ways to Optimize Full-Text Indexing"和一些these Full-Text Search tips on mssqltips.com

您可能最感興趣的全文關鍵字是CONTAINSCONTAINSTABLEThis page describes, among other things, how CONTAINSTABLE applies ranking

+0

嗚呼!正是我需要的,亞倫!感謝您的幫助。 +1並接受答案! –