У меня есть таблица MySQL InnoDB со столбцом «имя» (VARCHAR (255)), по которому я хочу, чтобы пользователи могли выполнять поиск, возвращая все соответствующие строки. Однако я не могу просто использовать запрос LIKE, потому что при поиске необходимо, чтобы пользователи вводили имена, которые похожи на доступные имена (например, с префиксом «The», или не знали, что правильное имя включает апостроф).
Два примера:
Имя в БД: «Роза и корона»
Пример возможных поисков, которые должны соответствовать: «Роза и корона», «Роза и корона», «Роза и корона», «Роза и корона»
Имя в БД: 'Diver's Inn'
Пример возможных поисков, которые должны совпадать: 'Divers' Inn ',' The Diver's Inn ',' Divers Inn '
Я также хочу иметь возможность ранжировать результаты по релевантности «ближайшего соответствия», хотя я не уверен, как это будет сделано (возможно, изменить расстояние?).
Маловероятно, что таблица когда-либо вырастет за несколько тысяч строк, поэтому метод, который не масштабируется до миллионов строк, подойдет. После ввода значение имени для данной строки не изменится, поэтому, если требуется дорогостоящая операция индексации, это не проблема.
Существует ли существующий инструмент, который будет выполнять эту задачу? Я посмотрел на Zend_Search_Lucence, но, похоже, он сосредоточен на документах, тогда как мне интересен только поиск по одному столбцу.
Редактировать: При поиске в SOUNDEX это не дает желаемых результатов. Например:
SELECT soundex( 'the rose & crown' ) AS soundex1, soundex( 'rose and crown' ) AS soundex2;
soundex1 soundex2
T6265 R253265
Решение: В конце концов я использовал Zend_Search_Lucence и просто притворился, что каждое имя на самом деле является документом, который, кажется, достигает желаемого результата. Я предполагаю, что это полнотекстовый поиск, хотя каждая строка не более 3-4 слов.