// Кодировка скрипта
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 написал(а):
Полнотекстовой поиск вроде не намного и быстрее, а вот недостатки у него есть...