Комментирование закрыто.
Быстрый поиск по сайту с помощью Sphinx.
Для реализации быстрого поиска на сайте, можно воспользоваться следующими техниками и технологиями:
- Установка формы быстрого поиска требует минимальных усилий. Например: http://www.google.com/coop/cse/onthefly
- Установка поискового сервера. Требует ощутимых ресурсов вашего сервера. Например: http://company.yandex.ru/technology/server
- Самописное решение используя полнотекстовый поиск MySQL. Например: http://phpclub.ru/detail/article/mysql_search
- Интеграция готовых поисковых решений в ваш сайт. Например: MnogoSearch.ru , SphinxSearch.com
Выбор того или иного решения обусловлен размерами вашего сайта, вида хостинга, конфигурацией сервера, требованиям к поисковой функции.
Мой выбор пал на Сфинкс.
Единственная полноценная статья на русском языке об этой программе есть на айбиэм.ком
http://www.ibm.com/developerworks/ru/library/os-php-sphinxsearch
правда описываемая версия уже устарела
и еще по мелоче можно найти на хабре.
Решить оперативные вопросы поможет форум на сайте сфинкса (есть русский раздел).
Мне удалось установить, настроить и потестировать его на шаред хостинге зенона,
но вот воспользоваться им там не получилось, так как хостер периодически убивает демона по тайм лимиту.
Сфинкс имеет два режима работы с индексом это обращение к предварительно запущенному демону (searchd) и поиск по индексу с помощью командной строки (утилита search).
Шаг 1. Установка.
Скачиваем, распаковываем, компилируем и инсталируем.
http://sphinxsearch.com/docs/current.html#installing
Шаг 2. Настройка.
Создаем файл sphinx.conf см. минимальную конфигурацию в файле sphinx-min.conf.dist
в нем разделы
source NAME # источник индекса: доступ к БД, SQL запрос, атрибуты (поля) для сортировки и фильтрации
index NAME # индекс: где будем хранить индекс и какого он вида (морфология, игноры, макс.длинна слова и т.д.)
indexer # индексёр: его параметры (выделенная память)
searchd # поисковый демон: его параметры
Шаг 3. Использование
3.1 Запускаем индексер
indexer NAME
3.2 Запускаем демон
searchd –config $HOME/MYPATH/spinx.conf
3.3 Выполняем поиск используя PHPAPI
Сфинкс позволяет настроить несколько индексов и расставить им вес при поиске (см в примере).
Сфинкс позволяет искать не только по базе данных, но и по внешним xml файлам.
Имеется механизм подсветки найденного.
Имеется множетсво различных режимов поиска (искать полное совпадение, частичное, искать фразу, можно использовать опреаторы для создания сложных запросов).
Мой фрагмент кода использования поиска по базе резюме:
<?php
include('sphinxapi.php'); // скачанная библиотека
$cl = new SphinxClient();
$cl->SetServer( "0.0.0.0", 3312 ); // адрес и порт моего демона
$cl->SetSortMode( SPH_SORT_RELEVANCE ); // режим сортировки
$cl->SetFieldWeights(array('profession' => 80, 'work' => 10,'more'=> 5)); // вес полей
$cl->SetLimits(($page-1)*$limit, $limit); // постраничный вывод
$cl->SetFilter( 'is_deleted', array( 0 ) ); // фильтр по флагу
$indexes = array('main'=> 10, 'also'=> 1); // вес индексов - main и also - имена моих индексов созданых в конфиге
$cl->SetIndexWeights($indexes);
$index = implode(', ', array_keys($indexes));
if ($params['city']) $cl->SetFilter( 'city', array( intval($params['city']) ) );
elseif ($params['region']) $cl->SetFilter( 'city', $cities );
if ($params['time']) $cl->SetFilterRange( 'created', time()-$params['time'], time() );
if ($params['salaryfrom']) {
if ($params['salaryto'])
$cl->SetFilterRange( 'salary', intval($params['salaryfrom']), intval($params['salaryto']) );
else
$cl->SetFilterRange( 'salary', intval($params['salaryfrom']), 999999999 );
}
elseif ($params['salaryto'])
$cl->SetFilterRange( 'salary', 0, intval($params['salaryto']) );
if ($params['text']) {
$cl->SetMatchMode(SPH_MATCH_EXTENDED2); // режим поиска
$stext = preg_replace("/-/"," ",$params['text']);
} else
$cl->SetMatchMode(SPH_MATCH_FULLSCAN);
$result = $cl->Query( $stext, $index );
if ( $result === false ) {
$content.= "Query failed: " . $cl->GetLastError() . ".<br>n";
}
else {
if ( $cl->GetLastWarning() ) {
$content.= "WARNING: " . $cl->GetLastWarning() . "<br>n";
}
if ( ! empty($result["matches"]) ) {
$id_list = implode(',', array_keys($result['matches']));
$sql = sprintf('SELECT resume.id, resume.profession FROM resume WHERE resume.id IN (%s) ORDER BY FIELD(resume.`id`, %s)',
$id_list, $id_list);
$res = mysql_query($sql) or die(mysql_error());
while($data = mysql_fetch_assoc($res)){
if ($params['text']) // Подсветка найденного текста
$pres = $cl->BuildExcerpts ( $data, 'also', $params['text'] , array('before_match') );
foreach($pres as $k=>$p) $content .= $p;
// .. .. ..
}
} else $content .= "По вашему запросу ничего не найдено. Попробуйте изменить запрос. ";
}
$totalfound = $result['total_found']>1000 ? 1000 : $result['total_found'];
?>
<html><body>
<form><input type=text name=text><input type=submit></form>
<? print $content ?>
</body></html>
Рубрики Searchengines, Sphinx, Вебмастеру | Comments Off
