PHP: найти 3-символьные слова в строке запроса, чтобы расширить полнотекстовый поиск MySQL - PullRequest
2 голосов
/ 16 сентября 2010

Я работаю над простой функцией полнотекстового поиска MySQL на сайте CakePHP и заметил, что MySQL удаляет короткие слова (3 знака или меньше) из запроса. Однако некоторые элементы на сайте имеют названия из трех символов, и я хотел бы включить их в результаты. (Я исключил использование более надежных поисковых устройств, таких как Solr, из-за бюджетных ограничений)

Итак, я хочу найти любые 3-х символьные слова в строке запроса и сделать быстрый поиск только в поле заголовка. Самый простой способ сделать это - explode() строка и перебрать полученный массив с strlen(), чтобы найти слова из 3 символов. Затем я возьму эти слова и выполню LIKE поиск в поле заголовка, просто чтобы убедиться, что ничего, что должно быть в результатах, не пропущено.

Есть ли лучший / более простой способ подойти к этому?

ОБНОВЛЕНИЕ: Да, я знаю о настройке ft_min_word_len в MySQL. Я не думаю, что хочу сделать это.

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

Существует системный параметр с именем «ft_min_word_len», с помощью которого вы можете определить минимальную длину слов для индексации. Вы можете установить значение этой директивы конфигурации на меньшее значение (например, 2): оно находится в разделе [mysqld] в вашем файле конфигурации MySQL. Этот файл обычно находится в «/ etc / mysql» или «/ etc». В окнах вы можете посмотреть в каталоге Windows или домашней папке MySQL.

[mysqld]
ft_min_word_len=2
0 голосов
/ 17 сентября 2010

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

У меня есть такая функция:

    $query = str_replace(array(',', '.'), '', $query);
    $terms = explode(' ', $query);
    $short = '';

    foreach($terms as $term){
        if(strlen($term) == 3){
            $short .= '"'.$term.'", ';
        }
    }

    if(!empty($short)){
        $short = trim($short, ', ');
    }

    return $short;

А затем я использую возвращенную строку для поиска в столбце title: WHERE title IN ($short), чтобы дополнить полнотекстовый поиск. Я произвольно назначаю оценку 3,5, чтобы возвращаемые записи могли быть отсортированы вместе с другими хитами полнотекстового поиска (я выбрал относительно высокую оценку, поскольку она точно соответствует title записи).

Это не очень элегантно для меня, но решает проблему.

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