2011-03-20 67 views
0

我有一个表,其中具有这种结构的MySQL数据库:MySQL查询匹配相似的单词/句子

CREATE TABLE `papers` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`title` varchar(1000) COLLATE utf8_bin DEFAULT NULL, 
`booktitle` varchar(300) COLLATE utf8_bin DEFAULT NULL, 
`journal` varchar(300) COLLATE utf8_bin DEFAULT NULL, 
PRIMARY KEY (`id`), 
FULLTEXT KEY `title_fulltext` (`title`), 
FULLTEXT KEY `booktitle_fulltext` (`booktitle`), 
FULLTEXT KEY `journal_fulltext` (`journal`) 
) ENGINE=MyISAM AUTO_INCREMENT=1601769 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

现在我知道在列标题中,地方的数百万行的范围内,有一个排它包含字符串

nFOIL: Integrating Naïve Bayes and FOIL. 

我想寻找

my_string = "nFOIL: integrating Naïve Bayes and FOIL" 

,并找到里ght行。您看到它必须是不区分大小写的搜索,并且查询中末尾的点不存在。我如何实现这一点?

我试图

SELECT id FROM papers WHERE UPPER(title) LIKE %s 

,并转换my_string在Python上的情况下,把一个“%”在my_string结束,但这并不缝处理一个很好的方式。它也没有工作。 =)

感谢您的任何建议!

回答

2

我看到你已经添加了FULLTEXT索引,尽管你已经知道MATCH AGAINST的MySQL语法。

你应该尝试

SELECT id FROM papers 
WHERE MATCH (title,booktitle,journal) AGAINST ('nFOIL: integrating Naïve Bayes and FOIL' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); 
+0

+1。我不知道“QUERY EXPANSION”。我只是阅读手册。 :) – 2011-03-20 19:18:21

+0

我试过了。事实证明,查询让我获得了很多结果。我想要的结果是所有结果的第三位。如果我将这部分查询放在“WITH QUERY EXPANSION”中,也有许多结果,但我希望的结果是结果的第一行。有什么不同? – Aufwind 2011-03-20 19:22:01

+0

在http://dev.mysql.com/doc/refman/5.0/en/fulltext-query-expansion.html上阅读关于WITH QUERY EXPANSION的更多信息 – Pentium10 2011-03-20 19:26:48

0

更改您在utf8_general_ci中的整理。 通过这种方式,您的搜索将不区分大小写。

+0

是否有可能改变现有数据的整理? – Aufwind 2011-03-20 19:10:30

+0

在更改数据库/表结构之前进行备份总是一个好主意。你的情况是。但是,在更改任何内容之前,请尝试遵循Pentium10的建议。 – 2011-03-20 19:20:49

+0

也谢谢! @ Pentium10s的回答让我走上了正轨! – Aufwind 2011-03-20 19:56:28