我有一张人们的全名表。我希望用户能够通过部分名称和拼写错误的名称进行搜索。因此,搜索“Andrew”也应该返回“Andrea”等。我认为 FULLTEXT
搜索就是答案,但它的工作方式似乎与我使用 搜索没有任何不同...喜欢“%Andrew%”
。
MySQL 中是否有函数或特性可以根据字符串相似度进行搜索?或者我是否必须使用 levenshtein()
或类似的东西在 PHP 端自行推出?
鉴于此表:
CREATE TABLE `people` (
`FullName` varchar(30) default NULL,
`namesID` int(11) NOT NULL auto_increment,
PRIMARY KEY (`namesID`),
FULLTEXT KEY `fulltext_FullName` (`FullName`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
LOCK TABLES `people` WRITE;
/*!40000 ALTER TABLE `people` DISABLE KEYS */;
INSERT INTO `people` (`FullName`,`namesID`)
VALUES
('Mark Peters',1),
('Bob Jackson',2),
('Steve Kipp',3),
('Joe Runty',4),
('Tina Mardell',5),
('Tim Havers',6),
('Rich Beckett',7),
('Mary Dalson',8),
('Maria Grento',9),
('Michael Colt',10),
('Andrew Peters',11),
('Andre Bison',12),
('Andrea Masters',13),
('Marla Tool',14);
/*!40000 ALTER TABLE `people` ENABLE KEYS */;
UNLOCK TABLES;
这个查询:
SELECT *
FROM people
WHERE MATCH(FullName) AGAINST('Andrew');
我只得到:
FullName namesID
Andrew Peters 11
当我还想得到:
Andre Bison
Andrea Masters
等等
最佳答案
FULLTEXT 索引只不过是全文索引。它们只允许搜索您实际拥有的文本。
MySQL 确实有一个 SOUNDEX()
函数,以及一个速记 x SOUNDS LIKE y
运算符,它与 SOUNDEX(x) = SOUNDEX( y)
.
如果 soundex 不能满足您的需求,您确实需要使用 PHP 等编程语言来完成您想要的任务。
关于MySQL 自然语言搜索没有像我希望的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355402/