MySQL查询匹配相似单词/句子

0 投票
2 回答
2917 浏览
提问于 2025-04-16 14:04

我在一个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"

我需要找到这一行。你看,这个搜索需要不区分大小写,而且查询的时候末尾的点也没有包含在内。我该怎么做呢?

我试过:

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

我在Python里把my_string转换成大写,并在my_string的末尾加了一个“%”,但这似乎不是个好办法。这样也没有成功。=)

谢谢任何建议!

2 个回答

0

把你的字符排序方式改成 utf8_general_ci。这样一来,你的搜索就不会区分大小写了。

2

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

你可以试试这个:

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

撰写回答