Как я могу найти несколько терминов в нескольких столбцах таблицы? - PullRequest
1 голос
/ 06 июля 2010

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

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

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

Я слышал о полнотексте и MATCH () ... ПРОТИВ (), но это звучит как довольно нечеткий поиск, и я не знаю, сколько работы нужно настроить. Я хотел бы получить точные результаты «да» или «нет» при разумных показателях. Поиск должен быть выполнен по 20 столбцам на 120000 строк. Надеемся, что пользователи не введут более двух или трех терминов.


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

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

Ответы [ 2 ]

0 голосов
/ 06 июля 2010

BOOLEAN MODE

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

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

0 голосов
/ 06 июля 2010

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

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

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

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

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

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