Поиск одного текстового столбца MySQL с нечетким соответствием - PullRequest
4 голосов
/ 29 мая 2011

У меня есть таблица 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 слов.

Ответы [ 2 ]

4 голосов
/ 29 мая 2011

Полнотекстовый поиск (FTS) - это терминология для желаемой функциональности базы данных. Там же:

1 голос
/ 29 мая 2011

Вот такой вопрос, который очень близок к тому, что вы хотите. Хотя ответ для PHP и MySQL, общий принцип все еще применяется:

Как сделать нечеткое совпадение названий компаний в MYSQL с PHP для автозаполнения?

По сути, вы бы использовали SOUNDEX, чтобы получить то, что вы хотите. Если вам нужно больше энергии, более длинные струны и т. Д., Возможно, вы захотите взглянуть на Double Metaphone, который лучше, чем Metaphone и SOUNDEX:

http://aspell.net/metaphone/

http://www.atomodo.com/code/double-metaphone

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...