MySQL MATCH() AGAINST() 等效于 SQL Server
Posted
技术标签:
【中文标题】MySQL MATCH() AGAINST() 等效于 SQL Server【英文标题】:MySQL MATCH() AGAINST() Equivalent for SQL Server 【发布时间】:2012-06-23 17:12:09 【问题描述】:有没有办法可以将这个全文搜索查询从 mysql 翻译成 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
感谢您的宝贵时间。
【问题讨论】:
为了我们这些了解 SQL Server 但不了解 MySQL 的人的利益,您能解释一下MATCH() AGAINST()
的作用吗?最好有一个例子 - 样本数据和期望的结果。这似乎是您在进行全文搜索,但这只是查询的猜测。
没问题。 MATCH() 采用 MySQL 表中的索引列并匹配传递给 AGAINST() 的字符串。它不会像column = 'string'
那样寻找等效的字符串,但它会返回类似的结果。它也比LIKE %string%
有用得多。按“分数”别名排序允许首先显示与字符串最密切相关的结果。这是我教我如何编写查询来进行全文搜索的文章:devzone.zend.com/26/using-mysql-full-text-searching
@AaronBertrand 我已经用示例更新了问题。是的,这是全文搜索。
“score”是表示单词在字符串中出现的次数,还是算法比这更复杂?
MySQL 自动计算一个“分数”别名。该分数通常类似于 .9823475 或 .124874,但始终大于零。它的范围可以超过 1,有时甚至可以达到 4。它不计算出现次数,而是对结果的准确性进行排名。
【参考方案1】:
这听起来确实像是实现全文搜索的一个案例。听起来您所追求的算法比CHARINDEX
、PATINDEX
和LIKE
提供的算法复杂得多,它们是非常简单的开/关类型结果(字符串包含搜索的表达式或不包含) t)。
全文搜索的官方 Microsoft 文档starts here。 This article may also be useful,以及这篇 MSDN 文章,"Improve the performance of full-text indexing",以及一些 these Full-Text Search tips on mssqltips.com。
您可能最感兴趣的全文关键字是CONTAINS
和CONTAINSTABLE
。 This page describes, among other things, how CONTAINSTABLE applies ranking.
【讨论】:
哇哦!正是我需要的,亚伦!感谢您的帮助。 +1 并接受回答!以上是关于MySQL MATCH() AGAINST() 等效于 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 部分单词匹配结合 MATCH...AGAINST 和 LIKE 作为备份
mysql全文索引用于 MATCH() AGAINST 但不用于 =
MySQL match() against() - 按相关性和列排序?