У меня есть таблица людей с полными именами. Я бы хотел, чтобы пользователи могли искать его с помощью частичных имен и имен с ошибками. Поэтому поиск "Андрея" также должен вернуть "Андреа" и т.д. Я думал, что поиск FULLTEXT
был ответом, но он не работает иначе, чем если бы я искал с помощью ... LIKE '%Andrew%'
.
Есть ли функция или функция в MySQL, которая будет искать на основе сходства строк? Или мне придется сворачивать свой собственный на конец PHP, используя levenshtein()
или что-то подобное?
Данная таблица:
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, чтобы выполнить то, что вы хотите.