[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Sphinx - быстрый поиск
PandoraBox2007
Установка

И так, приступим к практике. Установка стандартна и не вызывает никаких проблем.

Скачиваем архив с исходниками (последняя версия на момент написания статьи), распаковываем и устанавливаем:

Код
# ./configure
# make
# make install


под root
Код
# sudo su


Под FreeBSD выполнив эти 3 команды я получил продукт готовый к работе. А вот в Debian пришлось еще минуту повозиться (правда, в первый раз это заняло полчаса и выполнить:

Код
# sudo aptitude install libmysql++-dev libmysqlclient15-dev checkinstall


после этого все прекрасно заработало.
Подготовка

Теперь все готово для создания индекса (я предполагаю, что у вас есть некий проект с готовой БД) . Наша база имеет следующую структуру:

Структура БД

Будем искать по названию продукта, его описанию и тегам. Таким образом нам нужно создать индекс по этим полям. Для этого создадим 2 каталога /home/larin/data/ - тут будем хранить файлы индекса и /home/larin/log/ - тут логи и конфигурационный файл /home/larin/sphinx.conf

sphinx.conf

Код
source product
{
       type = mysql
       sql_host = localhost
       sql_user = test
       sql_pass = ******
       sql_db = product
       sql_port = 3306

       sql_query_pre = SET NAMES cp1251
       sql_query_pre = SET CHARACTER SET cp1251

       sql_query = SELECT p.product_id, p.producе_title, p.product_description, t.tag_name FROM `product` p LEFT JOIN `product_tag` pt ON pt.product_id = p.product_id LEFT JOIN `tag` t ON pt.tag_id = t.tag_id

       sql_query_info = SELECT * FROM `product` WHERE `product_id` = $id
       sql_ranged_throttle = 0
}

index product
{
       source = product
       path = /home/larin/data/product
       docinfo = extern
       mlock = 0
       morphology = stem_enru
       min_word_len = 2
       charset_type = sbcs
       charset_table = 0..9, A..Z->a..z, _, a..z, U+A8->U+B8, U+B8, U+C0..U+DF->U+E0..U+FF, U+E0..U+FF
       min_infix_len = 2
       enable_star = 1
}

indexer
{
       mem_limit = 32M
}

searchd
{
       address = 127.0.0.1
       port = 3312
       log = /home/larin/log/searchd.log
       query_log = /home/larin/log/query.log
       read_timeout = 5
       max_children = 30
       pid_file = /home/larin/log/searchd.pid
       max_matches = 1000
}


Вот и вся конфигурация, Sphinx готов начать индексировать ваши данные с гигантской скоростью Для более полной информации по конфигурированию зайдите на официальный сайт в раздел документации. Она на английском языке, но трудностей вызвать не должна, написана просто и доступно.



Спустя 1 минута, 56 секунд (16.05.2009 - 01:35) PandoraBox2007 написал(а):
Морфология

Spninx поддерживает индексацию (а следовательно и поиск) с учетом морфологии русского и английского языка. Поддержка морфологии реализована при помощи стемминга.

Стемминг – это процесс ведущий к выделению основы слова из сложных словоформ.

Вот строки в конфиге отвечающие за конфигурацию:
Код
Spninx поддерживает индексацию (а следовательно и поиск) с учетом морфологии русского и английского языка. Поддержка морфологии реализована при помощи стемминга.

Стемминг – это процесс ведущий к выделению основы слова из сложных словоформ.

Вот строки в конфиге отвечающие за конфигурацию:


#важно отметить, что в Sphinx прификсы считаются частью инфикса, т.е. указав индексацию по инфиксам мы автоматически индексируем и по префиксам
Код
min_infix_len = 2


#так должно быть Почему? Читайте документацию
Код
enable_star = 1


Индексация

Запускаем создание индекса:

Код
# indexer –config /home/larin/sphinx.conf –all


Все, индекс создан! Давайте искать!
Поиск

Для отладки и проверки работоспособности индекса подойдет утилита search. Пример использования:
# search –config /home/larin/sphinx.conf искомая фраза

А вот для реальной работы, нужно запустить демон сфинкса - searchd:

Код
# searchd –config /home/larin/sphinx.conf


Все, демон успешно стартовал (кстати, не плохо было бы добавить его в автозагрузку , и теперь мы с ним можем работать из наших PHP-скриптов, через официальное API. Необходимая библиотека sphinxapi.php находится внутри скачанного архива к каталоге api.

Пример скрипта

PHP
<?php
require ( "sphinxapi.php);
//....

$string = @$_GET['string'];
$sphinx = new SphinxClient();
$sphinx->SetServer('localhost'3312);

//Совпадение любого из слов
$sphinx->SetMatchMode(SPH_MATCH_ANY);

//Результаты отсортированы по релевантности
$sphinx->SetSortMode(SPH_SORT_RELEVANCE);

//Задаем полям веса, для подсчета релевантности
$w = array ('product_title' => 20'product_description' => 10'tag_name' => 5);
$sphinx->SetFieldWeights($w);

$result $sphinx->Query($string'*');
if (
$result && is_array($result['matches']))
{
 
//Получаем массив ID найденых товаров
 
$ids array_keys($result['matches']);

//А теперь выводим эти товары отсортированные по релевантности
 
$id_list implode(','$ids);
 
$sql sprintf('SELECT * FROM `product` WHERE `product_id` IN (%s) ORDER BY FIELD(`product_id`, %s)'$id_list$id_list);

//Все далее выполняем этот запрос и наслаждаемся результатами
}
//....


Спустя 1 месяц, 1 день, 10 часов, 47 минут, 8 секунд (17.06.2009 - 12:22) alexxz написал(а):
Какая необходимость ставить этот софт из под рута?
Сфинкс отлично ставится туда, куда надо, и работает без рута.

Спустя 3 дня, 4 часа, 57 минут, 19 секунд (20.06.2009 - 17:19) PandoraBox2007 написал(а):
Код
whereis sphinxsearch
cd {sphinx_pach} && make install
wink.gif

Спустя 5 дней, 23 часа, 34 минуты, 56 секунд (26.06.2009 - 16:54) fotomog написал(а):
А Сфинксом можно искать по части слова? Например есть слово "Автомобили" и нужно его найти по запросу "Авто".
Т.к. при стандартной установке и использовании такой возможности не наблюдаю!
Спасибо!

Спустя 1 час, 21 минута, 47 секунд (26.06.2009 - 18:16) kirik написал(а):
fotomog
Сфинксом можно искать "Автомобилей", "Автомобильчиков" smile.gif

Спустя 2 дня, 5 часов, 19 минут, 26 секунд (28.06.2009 - 23:35) PandoraBox2007 написал(а):
сфинкс замена полнотекстового поиска как отдельный демон что бы избавить БД от нагрузки

поиск отдельно, бд отдельно, скрипты отдельно ))

Спустя 6 дней, 15 часов, 54 минуты, 22 секунды (5.07.2009 - 15:30) FGnet написал(а):
мало что понимаю в PHP, читаю массу литерратуры, но толком ничего не получается, если кому нитрудно подскажите основы, html-выучил за ночь, подскажите как использовать Php? fgnet@yandex.ru или ася 384696056 rolleyes.gif

Спустя 4 часа, 31 минута (5.07.2009 - 20:01) waldicom написал(а):
Цитата (FGnet @ 5.07.2009 - 14:30)
html-выучил за ночь...

Шоб я так жил! Не за полярным кругом живешь?
Быстрый ответ:

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