Google, конечно, ищет хорошо, но корпоративные ресурсы вывешивать на открытый доступ нельзя, покупать google-mini с его ограничениями тоже не вариант. А поиск по базе внушительных размеров(4 гигабайта текстов, по которым и необходим поиск) надо. А если добаить к поиску по тексту еще и поиск по каким-то параметрам, то тут и google-mini не поможет и совсем страшно становится.
Но не стоит паниковать! На помощь нам приходит Sphinx — поисковый движок с открытым исходным кодом, который можно прикрутить практически к чему угодно не прилагая особых усилий
Вся прелесть Сфинкса в том, что индексирует он не сайт целиком, рекурсивно бегая по ссылкам, вытаскивая информацию(иногда совершенно ненужную), а базу в удобном нам формате.
Сфинкс состоит из 3 частей: индексатор, утилита search для поиска из командной строки, демон searchd, к которому мы будем обращаться с поисковыми запросами. Так же в дистрибутиве есть набор примеров использования Сфинкса на разных языках.
Для начала, наверное, стоит поставить Сфинкс.
Теперь немного о настройке и работе
Разбираться с поисковиком будем на простом и понятном примере — возможной упрощенной структуре Хабрахабра =)
Пусть топик имеет такую структуру:
Ну и добавим к топику тэги, куда же без них — Веб 2.0 как-никак
Самая сложная задача поиска, которую нам предстоит решить и с которой Cфинкс успешно справится — это поиск по текстам топика с какими-то тегами в определённом блоге
Теперь, собственно, сконфигурируем Сфинкс на нашу базу.
Открываем конфиг ( PREFIX/etc/sphinx.conf ). Сконфигурировать нам придется 2 части:
Источник, как можно догадаться по названию — это место откуда Сфинкс берет данные для индексации. Источники могут быть двух типов: какая-нибудь СУБД(если не ошибаюсь, сейчас поддерживаются только mysql и postgres) либо база XML. Мы работаем с mysql-ем.
Задаем источник
Источник есть, теперь создадим индекс. Индексов может быть много, но нам пока что нужен только один.
Параметры индексатора и поискового демона можно оставить по умолчанию.
Запускаем индексатор
Опция --all означает, то переиндексировать нужно все индексы.
Индекс построен, можно попробовать поискать. Воспользуемся утилитой search.
И получим список всех документов, где упоминается хабрахабр.
Поисковик готов! Теперь решим задачу, про которую говорилось ранее: поиск по топикам с определёнными тэгами в конкретном блоге.
Для этого Сфинксу нужно знать какие тэги к каким топикам относятся и в каком блоге какой топик находится.
К каждой записи можно добавить любое количество атрибутов. У нас их два: топик и блог. Говорим Сфинксу об этом. В конфиге источника добавляем строчки:
После этого переиндексируем базу и через утилиту search проверяем результат:
Сфинкс выдаст нам список топиков, помеченных тэгом с номером 42 и содержащих «поисковые слова».
К сожалению, утилита search не умеет ограничивать поиск по нескольким атрибутам, но через API это возможно(Если будет какой-нибудь резонанс, то отдельно опишу API).
Хочется добавить, что у Сфинкса довольно мощный «язык» запросов к нему. В расширенном решиме можно указывать какие столбцы с чем матчить, использовать выражения со скобками, сортировать и группировать результаты поиска, задавать функцию сортировки самостоятельно и еще много чего.
Полная документация на английском лежит здесь.
Ну вот и все.
P.S. Первый топик. Дебют удался? =)
Но не стоит паниковать! На помощь нам приходит Sphinx — поисковый движок с открытым исходным кодом, который можно прикрутить практически к чему угодно не прилагая особых усилий
Вся прелесть Сфинкса в том, что индексирует он не сайт целиком, рекурсивно бегая по ссылкам, вытаскивая информацию(иногда совершенно ненужную), а базу в удобном нам формате.
Сфинкс состоит из 3 частей: индексатор, утилита search для поиска из командной строки, демон searchd, к которому мы будем обращаться с поисковыми запросами. Так же в дистрибутиве есть набор примеров использования Сфинкса на разных языках.
Для начала, наверное, стоит поставить Сфинкс.
- Качаем исходники отсюда
- Распаковываем ( tar xzf sphinx-0.9.8.tar.gz )
- Конфигурируем ( ./configure --prefix=/path/to/sphinx)
- Собираем и ставим ( make install )
Теперь немного о настройке и работе
Разбираться с поисковиком будем на простом и понятном примере — возможной упрощенной структуре Хабрахабра =)
Пусть топик имеет такую структуру:
Field Type ----------------------- id int(11) blog_id int(11) Subject varchar(255) Content longtext
Ну и добавим к топику тэги, куда же без них — Веб 2.0 как-никак
Field Type ------------------- topic_id int(11) tag_id int(11)
Самая сложная задача поиска, которую нам предстоит решить и с которой Cфинкс успешно справится — это поиск по текстам топика с какими-то тегами в определённом блоге
Теперь, собственно, сконфигурируем Сфинкс на нашу базу.
Открываем конфиг ( PREFIX/etc/sphinx.conf ). Сконфигурировать нам придется 2 части:
- Источники
- Параметры индексации
Источник, как можно догадаться по названию — это место откуда Сфинкс берет данные для индексации. Источники могут быть двух типов: какая-нибудь СУБД(если не ошибаюсь, сейчас поддерживаются только mysql и postgres) либо база XML. Мы работаем с mysql-ем.
Задаем источник
source main
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306
# до этого момента, думаю, все понятно
# теперь нужно задать Сфинксу SQl-запрос, с помощью которого
# он будет вытаскивать информацию из нашей базы
sql_query = \
SELECT id, subject, content FROM Topics;
# и запрос, по которому можно получить топик.
sql_query_info = SELECT * FROM Topics WHERE id=$id
}
Источник есть, теперь создадим индекс. Индексов может быть много, но нам пока что нужен только один.
index main
{
source = main # используем источник main
path = /var/lib/sphinx/main # место, где будет храниться индекс
docinfo = extern # Это нам понадобится потом
morphology = stem_ru # Определяем морфологию, чтобы на запрос "хабрахабр"
# нам выдалось еще и "хабрахабра", "хабрахабре"
min_word_len = 1 # минимальный размер слова. Вдруг захотим искать предлоги?
charset_type = utf-8 # это понятно - кодировка
html_strip = 0 # вырезать ли HTML.
# В документации написано, что правильно работает только на
# идеальном html'e, но честно говоря, никогда не пробовал
}
Параметры индексатора и поискового демона можно оставить по умолчанию.
Запускаем индексатор
bin/indexer --all
Опция --all означает, то переиндексировать нужно все индексы.
Индекс построен, можно попробовать поискать. Воспользуемся утилитой search.
bin/search хабрахабр
И получим список всех документов, где упоминается хабрахабр.
Поисковик готов! Теперь решим задачу, про которую говорилось ранее: поиск по топикам с определёнными тэгами в конкретном блоге.
Для этого Сфинксу нужно знать какие тэги к каким топикам относятся и в каком блоге какой топик находится.
К каждой записи можно добавить любое количество атрибутов. У нас их два: топик и блог. Говорим Сфинксу об этом. В конфиге источника добавляем строчки:
# tags
sql_attr_multi = \
uint tag from query; \
SELECT topic_id, tag_id from tags;
# blogs
sql_attr_multi = \
uint blog from query; \
SELECT id, Blog from Topics;
После этого переиндексируем базу и через утилиту search проверяем результат:
bin/search -f tag 42 поисковые слова
Сфинкс выдаст нам список топиков, помеченных тэгом с номером 42 и содержащих «поисковые слова».
К сожалению, утилита search не умеет ограничивать поиск по нескольким атрибутам, но через API это возможно(Если будет какой-нибудь резонанс, то отдельно опишу API).
Хочется добавить, что у Сфинкса довольно мощный «язык» запросов к нему. В расширенном решиме можно указывать какие столбцы с чем матчить, использовать выражения со скобками, сортировать и группировать результаты поиска, задавать функцию сортировки самостоятельно и еще много чего.
Полная документация на английском лежит здесь.
Ну вот и все.
P.S. Первый топик. Дебют удался? =)
