Делаем "умный" быстрый поиск на DLE » Onm | Блог вебмастера
    Данный материал предоставлен сайтом Onm.by исключительно в ознакомительных целях.
    Администрация не несет ответственности за его содержимое.

Делаем "умный" быстрый поиск на DLE

Все дело в том, что стандартный поиск "из коробки" в DLE выполняет поиск по заголовку, краткой новости и полной - из-за этого в поле быстрого поиска предлагается совершенно не то, что ищет пользователь. Такой принцип работы подходит больше для блоговых сайтов, а на кинопорталах важен поиск по тайтлам статьи. В данной статье покажем как сделать поиск только по названиям и добавить возможность поиска при неверной раскладке клавиатуры.

Всё, что касется быстрого поиска находится в файле: engine/ajax/search.php

Для начала обучим поиск понимать английскую раскладку, для этого после строк
 if( $query == "" ) die(); $buffer = "";
}
Добавим расшифровку для каждого символа

function translit_en($string) {
    $letter = array(
    '`' => 'ё',    'q' => 'й',    'w' => 'ц',    'e' => 'у',    'r' => 'к',    't' => 'е',    'y' => 'н',    'u' => 'г',    
    'i' => 'ш',    'o' => 'щ',    'p' => 'з',    '[' => 'х',    ']' => 'ъ',    'a' => 'ф',    's' => 'ы',    'd' => 'в',    
    'f' => 'а',    'g' => 'п',    'h' => 'р',    'j' => 'о',    'k' => 'л',    'l' => 'д',    ';' => 'ж',    ''' => 'э',    
    'z' => 'я',    'x' => 'ч',    'c' => 'с',    'v' => 'м',    'b' => 'и',    'n' => 'т',    'm' => 'ь',    ',' => 'б',    
    '.' => 'ю',
    '~' => 'Ё',    'Q' => 'Й',    'W' => 'Ц',    'E' => 'У',    'R' => 'К',    'T' => 'Е',    'Y' => 'Н',    'U' => 'Г',    
    'I' => 'Ш',    'O' => 'Щ',    'P' => 'З',    '{' => 'Х',    '}' => 'Ъ',    'A' => 'Ф',    'S' => 'Ы',    'D' => 'В',    
    'F' => 'А',    'G' => 'П',    'H' => 'Р',    'J' => 'О',    'K' => 'Л',    'L' => 'Д',    ':' => 'Ж',    '"' => 'Э',    
    'Z' => 'Я',    'X' => 'Ч',    'C' => 'С',    'V' => 'М',    'B' => 'И',    'N' => 'Т',    'M' => 'Ь',    '<' => 'Б',    
    '>' => 'Ю'
    );
    return strtr($string, $letter);
    }
    function translit_ru($string) {
    $letter = array(
    'ё' => '`',    'й' => 'q',    'ц' => 'w',    'у' => 'e',    'к' => 'r',    'е' => 't',    'н' => 'y',    'г' => 'u',    
    'ш' => 'i',    'щ' => 'o',    'з' => 'p',    'х' => '[',    'ъ' => ']',    'ф' => 'a',    'ы' => 's',    'в' => 'd',    
    'а' => 'f',    'п' => 'g',    'р' => 'h',    'о' => 'j',    'л' => 'k',    'д' => 'l',    'ж' => ';',    'э' => '&#039;',    
    'я' => 'z',    'ч' => 'x',    'с' => 'c',    'м' => 'v',    'и' => 'b',    'т' => 'n',    'ь' => 'm',    'б' => ',',    
    '.' => 'ю',    
    'Ё' => '~',    'Й' => 'Q',    'Ц' => 'W',    'У' => 'E',    'К' => 'R',    'Е' => 'T',    'Н' => 'Y',    'Г' => 'U',    
    'Ш' => 'I',    'Щ' => 'O',    'З' => 'P',    'Х' => '{',    'Ъ' => '}',    'Ф' => 'A',    'Ы' => 'S',    'В' => 'D',    
    'А' => 'F',    'П' => 'G',    'Р' => 'H',    'О' => 'J',    'Л' => 'K',    'Д' => 'L',    'Ж' => ':',    'Э' => '&quot;',    
    'Я' => 'Z',    'Ч' => 'X',    'С' => 'C',    'М' => 'V',    'И' => 'B',    'Т' => 'N',    'Ь' => 'M',    'Б' => '<',    
    '>' => 'Ю'
    );
    return strtr($string, $letter);
    }


После этого находим строчку, которая отвечает за сам поиск
 $db->query("SELECT id, short_story, title, date, alt_name, category FROM " . PREFIX . "_post WHERE " . PREFIX . "_post.approve=1" . $this_date . " AND (short_story LIKE '%{$query}%' OR full_story LIKE '%{$query}%' OR xfields LIKE '%{$query}%' OR title LIKE '%{$query}%') ORDER by date DESC LIMIT 5");
И заменяем её на одну из предложенных:
1. Для поиска только по заголовку
 $en = translit_en($query);
    $ru = translit_ru($query);
    $db->query( "SELECT id, short_story, title, date, alt_name, category FROM " . PREFIX . "_post WHERE " . PREFIX . "_post.approve=1" . $this_date . " AND (title LIKE '%{$query}%' OR title LIKE '%{$en}%' OR title LIKE '%{$ru}%') ORDER by date DESC LIMIT 5" );
2. Поиск по заголовку и краткому описанию
$en = translit_en($query);
    $ru = translit_ru($query);
    $db->query("SELECT id, short_story, title, date, alt_name, category FROM " . PREFIX . "_post WHERE " . PREFIX . "_post.approve=1" . $this_date . " AND (short_story LIKE '%{$query}%' OR title LIKE '%{$query}%' short_story LIKE '%{$en}%' OR title LIKE '%{$en}%' short_story LIKE '%{$ru}%' OR title LIKE '%{$ru}%') ORDER by date DESC LIMIT 5");
3. Поиск по заголовку, краткому и полному описанию
$en = translit_en($query);
    $ru = translit_ru($query);
    $db->query( "SELECT id, short_story, title, date, alt_name, category FROM " . PREFIX . "_post WHERE " . PREFIX . "_post.approve=1" . $this_date . " AND (short_story LIKE '%{$query}%' OR full_story LIKE '%{$query}%' OR title LIKE '%{$query}%' OR short_story LIKE '%{$en}%' OR full_story LIKE '%{$en}%' OR title LIKE '%{$en}%' OR short_story LIKE '%{$ru}%' OR full_story LIKE '%{$ru}%' OR title LIKE '%{$ru}%') ORDER by date DESC LIMIT 5" );


Версия DataLife Engine  13.x 

Комментариев 1

Офлайн
Arthurnoupe
Arthurnoupe 25 октября 2018 21:21
+ 0 -

Спасибо, конечно, но DLE до умного поиска, как до луны)

Добавить комментарий

Кликните на изображение чтобы обновить код, если он неразборчив