2012-06-23 66 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并接受答案! –