Как сделать быстрый поиск по ~300 тыс. записям - MySQL

Узнай цену своей работы

Формулировка задачи:

Всем привет. Есть таблица в БД, где примерно 300 тыс. записей ФИО, но

имя и отчество, разделенные пробелом находятся в одном поле

(отчества может не быть): last_name | name -------------------- ... | ... Пушкин | Александр Сергеевич Эйнштейн | Альберт ... | ... ---------------------- Ищутся записи по запросу пользователя, причем вариации

написания пользователем могут быть разными

: ----------------------------

Имя Фамилия Отчество

или

Фамилия Имя Отчество

или

Фамилия

или

Фамилия Имя

... ---------------------------- и тд. Чтобы реализовать более менее релевантный поиск, я сначала проверяю количество слов в запросе пользователя, если больше одного, то разбиваю их с помощью PHP на несколько слов и делаю такие запросы:
Листинг программы
  1. $query_get = trim(strip_tags($_GET['query']));
  2. $query_arr = explode(" ", $query_get);
  3. $query_1 = $q_arr[0].'%';
  4. $query_2 = $q_arr[1].'%';
  5. $STH = DB::Connect()->prepare("
  6. SELECT `id`, `last_name`, `name` FROM `tb_people` WHERE "
  7. . "`last_name` LIKE :query_1 AND `name` LIKE :query_2
  8. ."LIMIT 0,$LIMIT"
  9. );
  10. $STH->bindParam(':query_1', $query_1);
  11. $STH->bindParam(':query_2', $query_2);
  12. $STH->execute();
  13. while($row = $STH->fetch()){
  14. $arResult[] =$row;
  15. }
  16. if(!$arResult){
  17. //новый запрос только с другой комбинацией слов из запроса пользователя
  18. }
В итоге все это очень медленно работает, т.к. поиск по всем записями осуществляется несколько раз, если не находится результат. Если использовать в одном запросе кучу OR и % вокруг слов запроса, то в результат попадает слишком много лишнего и неотсортированного по релевантности. Почитал про FULLTEXT INDEX в MySQL вроде он не подходит для поиска ФИО и в данном случае гораздо быстрее будет работать LIKE. Может кто посоветует как сделать более менее релевантный поиск по такой таблице, который будет не зависеть от порядка слов вводимых пользователем?

Решение задачи: «Как сделать быстрый поиск по ~300 тыс. записям»

textual
Листинг программы
  1. SELECT `id`, `last_name`, `name` FROM `tb_people` WHERE `last_name` LIKE "найт%" LIMIT 0,100

Объяснение кода листинга программы

  1. Подключение к базе данных.
  2. Выбор таблицы для выполнения запроса.
  3. Формирование SQL-запроса:
    • SELECT - выбрать данные из таблицы.
    • id, last_name, name - выбрать конкретные поля из таблицы.
    • WHERE - задать условие для отбора данных.
    • last_name LIKE найт% - задать условие, что поле last_name должно содержать строку найт.
    • LIMIT - ограничить количество возвращаемых записей.
  4. Выполнение запроса.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут