Поиск по нескольким столбцам MySQL - PullRequest
2 голосов
/ 28 февраля 2011

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

Пользователь ищет

John Doe

Сгенерированный SQL-запрос

SELECT * FROM users WHERE
(first_name LIKE '%john%' OR last_name LIKE '%john%') AND
(last_name LIKE '%doe%' OR last_name LIKE '%doe%');

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

ПРИМЕЧАНИЕ: Я хотел бы иметь возможность выполнить частичное соответствие,Поэтому я смогу найти Джона Доу, если поищу «Джон До»

РЕШЕНИЕ С помощью Роландо я, тем не менее, нашел решение, опубликованное для всех, ктонаходит это.Следуйте его инструкциям о том, как создать индекс ниже, затем запустите это:

SELECT * FROM users WHERE
(MATCH(first,last) AGAINST ('+john* +do*' IN BOOLEAN MODE))

1 Ответ

5 голосов
/ 28 февраля 2011

Ваша лучшая ставка здесь - создать индекс FULLTEXT, охватывающий два поля.

Шаг 1) Создать файл стоп-слов всего из трех слов

echo "a"> / var / lib/mysql/stopwords.txt
echo "an" >> /var/lib/mysql/stopwords.txt
echo "the" >> /var/lib/mysql/stopwords.txt

Шаг 2) Добавьте эти параметры в /etc/my.cnf

ft_min_word_len = 2
ft_stopword_file = / var / lib / mysql / stopwords.txt

Шаг3) Создать индекс FULLTEXT для столбцов имени и фамилии

Пользователи ALTER TABLE ДОБАВИТЬ FULLTEXT first_last_name_index (first, last);

Шаг 4) Реализовать функцию MATCH в своем поиске

Примерно так:

ВЫБРАТЬ * ОТ ПОЛЬЗОВАТЕЛЕЙ, ГДЕ (МАТЧ (первый, последний) ПРОТИВ («Джон» В БУЛЕВОМ РЕЖИМЕ)) И (МАТЧ (первый, последний) ПРОТИВ («Доу» В БУЛЕВОМ РЕЖИМЕ)));

Нажмите здесь, чтобы узнать больше об индексации FULLTEXT

...