MySQL LIKE% string% недостаточно простителен. Что-нибудь еще, что я могу использовать? - PullRequest
6 голосов
/ 29 октября 2011

У меня есть клиент, который запрашивает их поиск, который ищет названия компаний, которые можно искать в нескольких форматах, в зависимости от ввода пользователя, например, компания, хранящаяся в базе данных, например, AJR Kelly Ltd, если пользователь ищет "AJR Kelly", найденный, используя;

<cfif pctermsCount gt 0>
AND (LOWER(p.name)  LIKE '%#pcTerms#%')
</cfif>

Если они ищут «Келли», компания будет найдена, но если они ищут неработающую версию строки, например «A J Kelly» или «AJ Kelly», она не будет найдена.

Могу ли я что-нибудь сделать, чтобы сделать его немного более прощающим?

Спасибо.

Ответы [ 4 ]

8 голосов
/ 29 октября 2011

Если вы используете MyISAM, вы можете использовать полнотекстовое индексирование. См. Этот урок

Если вы используете другой механизм хранения, вы можете использовать сторонний полнотекстовый механизм, такой как sphinx, который может действовать как механизм хранения для mysql или отдельный сервер, который можно запрашивать.

При полнотекстовой индексации MySQL поиск по A J Kelly будет соответствовать AJ Kelly (не путать, но A, J и AJ будут игнорироваться, так как они слишком короткие по умолчанию и соответствуют Kelly.) Как правило, полный текст гораздо более простителен (и обычно быстрее, чем LIKE '% string%'), потому что допускает частичные совпадения, которые затем могут быть ранжированы по релевантности.

Вы также можете использовать SOUNDEX , чтобы сделать поиск более щадящим, проиндексировав фонетические эквиваленты слов и выполнив их поиск, применив SOUNDEX к поисковым терминам, а затем применив их для поиска в индексе. С soundex mary, marie и marry все совпадут, например.

4 голосов
/ 29 октября 2011

Если вы действительно используете ColdFusion, у вас есть доступ к полнотекстовой индексации CF с использованием Verity или Solr / Lucene .Любой из них должен дать вам хорошую возможность «нечеткого соответствия» для строк.

Необходимость использования таблиц MyISAM - горькая пилюля только для полнотекстовой индексации - вы теряете душевное спокойствие и такие вещи,Ограничения внешнего ключа.

2 голосов
/ 29 октября 2011

Вы можете создать новый столбец и сделать его доступной для поиска версией имени, удалив пробел, а затем установить тип данных столбца как FULLTEXT (будет работать только с MyISAM).Вы можете посмотреть в Lucene / SOLR.SOLR предлагает несколько токенизаторов, которые очень хорошо работают в подобных ситуациях.Кривая обучения довольно высока, но в конечном итоге она того стоит.

1 голос
/ 29 октября 2011

Хитрость, я полагаю, что простым методом было бы удалить пробелы при поиске по термину в базе данных, поэтому вместо AJR Kelly используется AJRKelly.Затем используйте пробел в качестве разделителя для отдельных поисковых терминов.Таким образом, AJ Kelly будет искать A, J и Kelly по отдельности.Эй Джей Келли будет искать Эй Джей и Келли по отдельности.Они будут соответствовать термину удаленной базы данных AJRKelly.

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