Стандартный поиск / search и слова через дефис, как улучшить? [Решено]

Аватар пользователя Serg_M Serg_M 5 октября 2009 в 12:31

Стоит Drupal 6.13, включен стандартный поиск. Заметил, что если есть слова, написанные через дефис, например, полицейский-маг, то поиск выдает верный результат, только в строгом соответствии. А хотелось бы, чтобы информация находилась и при запросе без дефиса, например, полицейский маг.
Может кто-нибудь знает, где "подкрутить", чтобы расширить возможности стандартного поиска?

0 Thanks

Комментарии

Аватар пользователя Serg_M Serg_M 10 ноября 2015 в 11:46

kosilko - большущее СПАСИБО, оказалось само-то. Правда код какой-то малюсенький получился:

<?php
// $Id: poisk_defis.module,v 0.1 2009/04/16 00:37:32 Serg_M Exp $
 
function poisk_defis_search_preprocess($text) {
  return str_replace('-', ' ', $text);
}

Но вроде работает. Т.е. теперь поиск осуществляется и по составным словам: полицейский, маг и по фразам: полицейский маг, полицейский-маг.
Странно, что это не сделано в дистрибутиве.

Модуль прилагается. Протестировать можно здесь, например по фразе: Кашкин-Первомайский.

Аватар пользователя kosilko kosilko 6 октября 2009 в 12:36
"Serg_M" wrote:

Правда код какой-то малюсенький получился

очистите все таблицы search_*, запустите крон. Проверьте свою поисковую индексацию на наличие дублей. Что-то вроде такого косяка должно вылезти, были какие-то подводные камни. Тоже думал что короткий код проканает =)

У меня на данный момент вот такой код крутится, писал давно, комментарии расставил сейчас:

function my_srch_search_preprocess($text) {

        $new_arr = array();
        $min = variable_get('minimum_word_size',3);//макс.длина слова(см. в админке)

        foreach (explode(' ',str_replace(array('_', '.', '-'),' ',$text)) as $chunk) {
        /* бъем строку в массив по пробелу
        (предварительно заменив на пробел некоторые знаки -
        тире, подчеркивание , на счет точки кстати не факт что оно надо)
        и проходим его в цикле */

                if (($chunk = trim($chunk))!='' && drupal_strlen($chunk) >= $min) {
                        $new_arr[$chunk]=$chunk;
                        /* тупо ложим слова в новый массив,
                        при этом дубликаты слов исключаются */

                }
        }
        $result = trim(implode(' ',$new_arr)); //обратно из массива в строку
        return $result == '' ? $text : $result; //так, на всякий пожарный-)
}

Аватар пользователя Serg_M Serg_M 6 октября 2009 в 13:14
"kosilko" wrote:

очистите все таблицы search_*,

Да, забыл написать, что нужна переиндексация сайта.
Кстати, почистить таблицы search_* и переиндексация сайта это вроде должно быть одно и то-же?

kosilko спасибо за свой код, попытаюсь разобраться.

Аватар пользователя kosilko kosilko 6 октября 2009 в 16:21
"Serg_M" wrote:

стати, почистить таблицы search_* и переиндексация сайта это вроде должно быть одно и то-же?

переиндексация не полностью очищает эти таблицы

Аватар пользователя Serg_M Serg_M 7 октября 2009 в 6:37
"kosilko" wrote:

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

Вроде не заметил дублей.

Потестировал код от kosilko. search_index уменьшился на несколько тысяч записей, но за счет того, что в индекс не попадают числа единицы и десятки (в нетронутом варианте слова режутся до минимум 3, но цифирки остаются от 1). С одной стороны хорошо, но с другой... Попробовал поиск строго по фразе "dvd-5", в выдачу попали и странички, где было просто dvd.

Таблицы search_* растут прямо на глазах. Интересно при каком количестве нод начнутся тормоза с поиском? Неуж-то нужно присматриваться к google search, но у меня там проиндексировалось очень мало...

Аватар пользователя kosilko kosilko 7 октября 2009 в 10:58
"Serg_M" wrote:

не попадают числа единицы и десятки (в нетронутом варианте слова режутся до минимум 3, но цифирки остаются от 1)

значит придется код исправлять... Вместо
... && drupal_strlen($chunk) >= $min) { ...
написать к примеру
... && (is_numeric($chunk) || drupal_strlen($chunk) >= $min)) { ...
и наверное все-таки убрать обработку точек.

По поводу скорости. На практике, имеется сайт с примерно 5 тысячами нод, таблица search_index содержит 268 тысяч записей, search_total - 55 тыс - тормозов не вижу.