[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скрипт поика по БД
igor717
Всем добрый вечер, написал скрипт поиска по БД, но не совсем уверен, что он "правильный". Прошу указать на ошибки, способы оптимизации...

// Кодировка скрипта 
mb_internal_encoding('utf-8');

// Переменные вывода
$result_search = '';
$total_search = 0;
$back_search = '';
$next_search = '';
$rows_search = '';

// Определяем количество найденного материала на одной странице
$max_total_search = 3;

// Минимальная длина слов, по которым осуществляется поиск
$length_word = 3;

// Присваиваем значение POST-переменной GET
if (!empty($POST['value1']))
{
$GET['value3'] = str_ireplace(' ', '_', $POST['value1']);
$GET['value4'] = 0;
$GET = htmlChars($GET);
}

////////////////////////////////////////////////////////////


// Если существует поисковый запрос

if (!empty($GET['value3']))
{


// Подключаем файл функций MySQL

include_once './libs/mysql.php';

// Разбиваем строку на отдельные слова и формируем запрос

$words = preg_split("/[_]+/",$GET['value3']);

foreach($words as $line)
{

$line = trim(mb_strtolower($line));
if (mb_strlen($line) >= $length_word)
{
$line = morphology($line, $length_word);
$rezult[] = $line;
$zapros[] = "(content LIKE '%". mysql_escape_string($line). "%')";
$zapros_news[] = "(content LIKE '%". mysql_escape_string($line). "%') OR
(description LIKE '%"
. mysql_escape_string($line). "%')";
}
}


if (empty($zapros))
define('GENERAL_SEARCH_1', './skins/tpl/search/error.tpl');

else
{
define('GENERAL_SEARCH_1', './skins/tpl/search/no_error.tpl');

// Выбор результатов поиска из БД

$res_search = mysqlQuery("SELECT headline, content, var, search
FROM `"
. DBPREFIX ."main". LANGUAGE_DBPREFIX ."`
WHERE "
. implode(" OR ", $zapros) ."
UNION
SELECT headline, content, var, search
FROM `"
. DBPREFIX ."section". LANGUAGE_DBPREFIX ."`
WHERE publish = '1' AND "
. implode(" OR ", $zapros) ."
UNION
SELECT headline, content, var, search
FROM `"
. DBPREFIX ."category". LANGUAGE_DBPREFIX ."`
WHERE publish = '1' AND "
. implode(" OR ", $zapros) ."
UNION
SELECT headline, content, var, search
FROM `"
. DBPREFIX ."article". LANGUAGE_DBPREFIX ."`
WHERE publish = '1' AND "
. implode(" OR ", $zapros) ."
UNION
SELECT headline, content, var, search
FROM `"
. DBPREFIX ."news". LANGUAGE_DBPREFIX ."`
WHERE publish = '1' AND "
. implode(" OR ", $zapros_news) ."
"
);

// Количество найденных материала

$total_search = mysql_num_rows($res_search);
if ($total_search == 0)
{
$result_search = SEARCH_5 .' "'. htmlChars($GET['value3']) .'", '. SEARCH_6;
$GET['value4'] = 0;
}

else
{

// Число страниц необходимых для вывода результатов поиска из БД

$total_page_search = ceil($total_search / $max_total_search);

// Определяем первую и последнюю страницы

if ($GET['value4'] > $total_page_search)
$GET['value4'] = $total_page_search;

elseif ($GET['value4'] < 1)
$GET['value4'] = 1;

// Формирование информаци о результатах поиска

$result_search = SEARCH_7 .' "'. $GET['value3'] .'":';

// Определяем нужны ли стрелки

if ($GET['value4'] > 1)
$back_search = '<a href="'. href('value4='. ($GET['value4'] - 1)) .'">'. SEARCH_11 .'</a>';

else
$back_search = '';

if ($GET['value4'] < $total_page_search)
$next_search = '<a href="'. href('value4='. ($GET['value4'] + 1)) .'">'. SEARCH_12 .'</a>';

else
$next_search = '';

// Проверяем есть ли нужный шаблон и записываем его

$tpl_search = getTpl('search/rows_search');

// Переменные определяющие сколько результатов попадет на страницу

$sartpage = sartpage($GET['value4'], $total_page_search, $max_total_search);
$endpage = $sartpage + $max_total_search + 1;
$num = 0;

// Выводи результаты поиска

while($row_search = mysql_fetch_assoc($res_search))
{
++$num;
if ($num > $sartpage and $num < $endpage)
{
$row_search['num'] = $num;
$row_search['content'] = IlluminationFound($row_search['content'], $rezult);
$rows_search .= parseTpl($tpl_search, $row_search);
}
}
}
}
}

else
define('GENERAL_SEARCH_1', './skins/tpl/search/no_error.tpl');


И он еще вызывает несколько функций:

// Функция определения начальной точки вывода 

function sartpage($number, $total_page, $max_total_page)
{
if ($number <= 0)
$number = 1;

elseif ($number > $total_page)
$number = $total_page;

return $number * $max_total_page - $max_total_page;
}

// Функция морфологии (русские слова)

function morphology($line, $length_word)
{
$word = preg_replace('/(|ого|ому|ему|его|ыми|ими|ями|ами|ешь|ете|ишь|ите|ое|ый
|ым|ая|яя|ее|юю|ую|ые|ие|ых|их|ым|ых|их|ою|ей|ий|ам|ям|ах|ях|ом|ой|ет|ем|ут|ют
|ит|им|ат|ят|а|я|и|е|у|ю|ы|о|)$/'
, '', $line);
$word = preg_replace('/(|оньк|еньк|)$/', '', $word);

if (mb_strlen($word, 'UTF-8') >= $length_word)
return $word;

else
return
$line;
}

// Функция подсветки слов в поисковых запросах

function IlluminationFound($content, $rezult)
{
mb_internal_encoding('utf-8');

$begin_counting = '';
$request = '';
$begin = '';
$end = '';
$long = 100;


$content = ' '. trim(preg_replace("/<[^>]*>/", " ", $content));
$content = mb_strtolower($content);


foreach($rezult as $line)
{
$coincidence = mb_strpos($content, $line);

if ($coincidence == true)
{
$begin_counting = $coincidence;
$request = $line;
break;
}
}


$begin = $begin_counting - 100;
if ($begin < 0)
{
$begin = 0;
$long = 200;
}

$end = $begin_counting + mb_strlen($request) + $long;

$content = '.....'. trim(mb_substr($content, $begin, $end)) .'.....';

foreach($rezult as $line)
$content = str_ireplace($line,'<span id="light">'. $line .'</span>', $content);

return $content;
}







Спустя 12 часов, 21 минута, 24 секунды (25.05.2010 - 09:03) vagrand написал(а):
Сильно не вникал в скрипт, но запрос с несколькими условиями LIke '%...%' объединенными при помощи OR будет выполнятся очень и очень долго.

Спустя 9 часов, 8 минут, 38 секунд (25.05.2010 - 18:12) igor717 написал(а):
А как по-другому?

Спустя 1 час, 2 минуты, 40 секунд (25.05.2010 - 19:15) vagrand написал(а):
полнотекстовый поиск или что-то вроде sphinx + покурить БД на предмет оптимизации

Спустя 10 минут, 22 секунды (25.05.2010 - 19:25) igor717 написал(а):
Полнотекстовой поиск вроде не намного и быстрее, а вот недостатки у него есть...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.