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

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

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

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

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

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

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

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

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

или

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

или

Фамилия

или

Фамилия Имя

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

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

textual
Листинг программы
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