Как искать несколько терминов в нескольких столбцах таблицы?

У меня есть таблица, в которой перечислены люди и вся их контактная информация. Я хочу, чтобы пользователи могли выполнять интеллектуальный поиск в таблице, просто введя некоторые вещи и вернув результаты, когда каждый член, который они ввели, соответствует хотя бы одному из столбцов в таблице. Чтобы начать, я сделал запрос типа

SELECT * FROM contacts WHERE firstname LIKE '%Bob%' OR lastname LIKE '%Bob%' OR phone LIKE '%Bob%' OR ... 

Но теперь я понимаю, что это полностью потерпит неудачу на чем-то таком же простом, как «Боб Дженкинс», потому что он недостаточно умен, чтобы искать первое имя отдельно. Что мне нужно сделать, так это разделить термины поиска и искать их по отдельности, а затем каким-то образом пересечь результаты от каждого термина. По крайней мере, это похоже на решение для меня. Но как лучше всего это сделать?

Я слышал о полнотекстовом и MATCH () … AGAINST (), но это звучит как довольно нечеткий поиск, и я не знаю, сколько работы он должен настроить. Я бы хотел получить точные да или нет с разумной производительностью. Поиск должен выполняться примерно на 20 столбцах на 120 000 строк. Надеемся, что пользователи не будут вводить более двух-трех терминов.


Извините, я забыл упомянуть, что использую MySQL (и PHP).

Я просто вычислил полнотекстовый поиск, и это крутой вариант для рассмотрения (есть ли способ настроить, насколько он строгий), LIMIT будет просто отбивать результаты независимо от того, насколько хорошо он соответствует). Но для этого требуется полнотекстовый индекс, и мой веб-сайт использует представление, и вы не можете индексировать представление правильно? Так…

Я бы предложил использовать MATCH / AGAINST. Полнотекстовый поиск – это более продвинутый поиск, более похожий на Google, менее элементарный.

Он может соответствовать нескольким таблицам и оценивать их, сколько совпадений у них есть.

В противном случае, если слово есть вообще, особенно. на нескольких таблицах у вас нет рейтинга. Вы можете сделать ранжирование на стороне сервера, но это займет больше времени программирования.

В зависимости от того, какую базу данных вы используете, способность выполнять перекрестные столбцы может стать более или менее сложной. Вероятно, вы не хотите делать 20 JOINs, так как это будет очень медленный запрос.

Существуют также такие двигатели, как Sphinx и Lucene, предназначенные для выполнения этих типов поиска.

BOOLEAN MODE

 SELECT * FROM contacts WHERE MATCH(firstname,lastname,email,webpage,country,city,street...) AGAINST('+bob +jenkins' IN BOOLEAN MODE) - SELECT * FROM contacts WHERE MATCH(firstname,lastname,email,webpage,country,city,street...) AGAINST('+bob +jenkins' IN BOOLEAN MODE) 

Логический режим очень мощный. Это может даже удовлетворить все мои потребности. Мне нужно будет провести некоторое тестирование. Помещая + перед поисковыми терминами, эти условия становятся обязательными. (Строка должна соответствовать «bob» и «jenkins» вместо «bob» или «jenkins»). Этот режим даже работает на неиндексированных столбцах, и поэтому я могу использовать его в представлении, хотя он будет медленнее (это то, что мне нужно проверить). Одна из последних проблем, с которыми я столкнулась, заключалась в том, что это не соответствовало частичным поисковым запросам, поэтому «боб» не нашел бы «бобби», например. Обычный групповой символ % не работает, вместо этого вы используете звездочку * .