Персональные блоги

Анонс модуля поиска

Данная статья является незаконченной и будет дописана.

С некоторых пор использую sphinx для поиска на сайте, есть огромное желание его доделать.

Попробовал альтернативы — apache solr, yandex search, но использовать хочу именно sphinx. Об альтернативах поподробней (плюсы и недостатки) напишу здесь позже.
Кому интересно — смотрите ниже.

Тем не менее, есть один маленький гвоздик, который не дает покоя в голове — к сожалению, sphinx не умеет искать по документам.

В частности, это желание продиктовано Приказом Министерства экономического развития Российской Федерации (Минэкономразвития России) от 16 ноября 2009 г. N 470 г. Москва «О Требованиях к технологическим, программным и лингвистическим средствам обеспечения пользования официальными сайтами федеральных органов исполнительной власти»
http://www.rg.ru/2010/01/27/saity-dok.html, поскольку оно почти везде спускается до регионов, пока муниципалитеты только не трогают.

4. Программное обеспечение и технологические средства обеспечения пользования официальным сайтом, а также форматы размещенной на нем информации должны:

б) предоставлять пользователям информацией возможность беспрепятственного поиска и получения всей текстовой информации, размещенной на официальном сайте, включая поиск документа среди всех документов, опубликованных на сайте, по его реквизитам, содержанию документа, а также по фрагментам текста, содержащегося в размещенном на официальном сайте документе;

Есть конечно некоторые костыли, но, к сожалению, они плохо поддерживаются и непригодны к использованию сразу.

Но решение такое найти удалось — можете посмотреть на демо-сайте http://d7.upi.ru/ — корректный поиск по вложениям.
Демо я собрал за ночь, поэтому не судите строго, дальше там появится полноценный модуль. Пока работает на 7-ке, но разницы между 6 и 7 особо нет.

Apache Solr.

В данный момент эта система самая мощная.

  • Faceted search
  • MVA
  • Dynamic fields

Архитектура такая — запускается сервлет, с настроенной универсальной схемой описания данных (dynamic fields) — schema.xml, после чего модуль друпал «кладет» в индекс данные, и забирает их оттуда при запросе.

Практически все, что умеет sphinx, Apache solr умеет. Для этого поискового движка написано много модулей для drupal, все работает. Основной модуль — http://drupal.org/project/apachesolr

Самый жирный плюс Solr — dynamic fields, которые позволяют динамически размещать в поисковом индексе поля.

Единственный недостаток, как уже написали в комментах — это java. Работает не так быстро, и кушает много памяти. Приведу статистику памяти:

upi ~ # ps -ely
   VSZ   RSS COMMAND
219608 174884 searchd
822352 486436 mysqld
226160  9620 apache2
 45608  4008 nginx
1528728 166216 java

RSS — это размер резидентной памяти (ОЗУ) в килобайтах,
VSZ — занимаемая процессом виртуальная память в килобайтах.
mysql для примера привел, у меня там индексов 128M (key) + 256M (query) = 384M

При этом работает без нагрузки (индекс пустой), без tomcat.
Впрочем, в версии 1.3 добавили «Solr Cores», поэтому возможно запустить несколько индексов на одном приложении.

Sphinx

В этой системе существует 2 основных источника данных (интеграцию с mysql не рассматриваем):

  • БД (mysql)
  • xmlpipe

БД работает может быть в 100 раз быстрее при индексировании, но имеет существенный недостаток:
Для индексации данных нужно сначала составить запрос, т.е. заранее знать какими будут данные и что нужно индексировать. А также составлять разные запросы для разных типов данных, и непонятно как потом эти разные объединять.

Поясню на примере — есть блоги, у которых есть категория (модули,разработка,персональные) и есть резюме — куча полей. Вопрос — как сделать индекс, чтобы выполнить 2 запроса
1. искать по тексту в резюме и человек из москвы
2. искать по тексту блога и рубрика модули

Я так понял, что Apache solr это умеет. Пример — поиск на drupal.org модули + 4 фильтра (категория, версия и т.д.), хотя допускаю, что это может быть реализовано отдельным индексом.

xmlpipe — преимущество в том, что схема данных определяется на стороне клиента. Недостаток заключается в node_load() на каждую ноду, которую надо поместить в индекс, вместо SELECT, что приводит к большой перегрузку и в коде модуля очень много проверок на time_limit, memory_limit — как вы понимаете это неспроста. То есть индексация тяжелая, но запросы такие же быстрые.

Модули друпал:
http://drupal.org/project/sphinx — практически мертвый проект, схему пишем сами (БД), модуль дает блок для поиска и страницу результатов. работает
http://drupal.org/project/sphinxsearch — реализация xmlpipe. работает.
http://drupal.org/project/searchlight — смотрел его год назад, там что-то про интеграцию с views, на drupal.org релиза не было — последний коммит на github был первым или вторым всего — видимо, проект заброшен.

Честно говоря, если переделывать / делать новый модуль, то интереснее переделать apachesolr или отделить оттуда solr и предоставить выбор sphinx | solr, а реализацию вставить из sphinxsearch. В apachesolr больше сделано, есть куча доп. модулей, было бы неплохо интегрировать.

В общем посмотрел, что умеет Apache Solr, умеет он больше и лучше при первом знакомстве, на днях добавлю туда индекс и сниму немного статистики для наглядности. Чтобы мнение было непредвзятым.
Кстати, то что я писал в начале статьи по поиску во вложениях — это тоже работа команды apache solr, я этот кусок просто вырезал оттуда, чтобы к sphinx приспособить. Приделаю его к sphinxsearch и выложу сюда, если он нужен.

Как подключить словарь к sphinx.

0. Зачем этот словарь нужен: если использовать обычный стемминг, то некоторые слова будут считаться разными, т.е. sphinx не сможет выделить у них корень, и, соответственно, не выдаст их в запросе со всеми словоформами. Впрочем, и после этого заметил, что некоторые фамилии, названия он склонять не умеет. Но 138К слов согласитесь неплохой словарный запас.

Этот словарь используется — в ispell, myspell, hunspell (Open office), ниже дана официальная страница проекта. Программа spelldump поставляется вместе с sphinx.

1. Качаем словарь Александра Лебедева, основанный на версии Neal Dalton. Он содержит 138 816 корней слов. Для компиляции нужен ispell, но для наших целей это не обязательно, главное получить russian.dict, russian.aff. По сути это набор правил для применения окончаний к словам, чтобы sphinx мог корректно выделить корень у слова. Например «юанях > юань». http://fmg-www.cs.ucla.edu/geoff/ispell-dictionaries.html#Russian-dicts

2. Делаем словарь и подключаем его к sphinx, как указано в документации: http://sphinxsearch.com/docs/manual-1.10.html#conf-wordforms

Код будет такой:

wget ftp://scon155.phys.msu.su/pub/russian/ispell/rus-ispell.tar.gz
tar xzf rus-ispell.tar.gz
make
spelldump russian.dict russian.aff russian.txt
iconv -f koi8r -t utf8 russian.txt >rus.txt

Последняя команда меняет кодировку словаря из KOI8-R в UTF-8. Получившийся файл будет весить примерно 60 мегабайт.
Теперь этот словарь можно скопировать, например, в папку где у вас лежат индексы
cp rus.txt /var/lib/data/

И в определении индекса указать словарь:

sphinx.conf:
index news {
  …
  wordforms = /var/lib/data/rus.txt}

Теперь Ваш sphinx будет довольно неплохо знать русский язык.

 
 
03.06.2011 — 11:42

Комментарии (12)

Аватар пользователя andribas
03.06.2011 — 13:34
0
 
 

Замечены глюки с документами консультант-плюса:
в формате rtf они что-то криво пишут, не распознается корректно charset.

Аватар пользователя Vegas
03.06.2011 — 14:59
0
 
 

те кто имел дело с написанием модулей под битрикс в цирке не смеются

Аватар пользователя andribas
03.06.2011 — 15:14
0
 
 

просто у них вот такая штука есть — http://www.trusted.ru/products/trustedbirixlogin/
аналогов пока нету.
Можно конечно у «цифровых технологий» бинарник модуля апача купить TLS и потом прокси, думал про это, но не слышал, чтобы кто-нибудь это делал.
А у нас, например, вот такой документ есть — http://mininform74.ru/oblastnye-tselevye-programmy-razrabatyvaemye-i-rea...
наверняка эта программа в каждом регионе есть.
правда это оффтоп.

Аватар пользователя gor
03.06.2011 — 17:57
1
 
 

Очень интересно. подпишусь
Я сейчас переписываюсь с автором модуля sphinxsearch — возможно co-maintainer. Есть идеи по доработке модуля так, чтоб можно было и «простым смертным» в пару кликов на нашем хостинге его включить.

Аватар пользователя rkozyrkov
04.06.2011 — 00:20
2
 
 

вообще-то вещь интересная. хотелось бы реализацию на 6-ку. как только уйду с хостинга ненавистного мне руцентра. сразу же поставлю sphinx

Аватар пользователя Владимир
04.06.2011 — 07:53
0
 
 

Можно пару слов чем apache solr не устроил? А то сейчас выбираю что использовать на VPS.

Аватар пользователя gor
04.06.2011 — 21:14
1
 
 

Aache solr крутится на джаве. Обычно под apache solr предлагают ставить отдельный сервер.
В сравнение sphinx search это скомпилированная бинарная программа. И из нашего опыта — вполне отлично живет у нас на хостинге.
Правда мы рекомендуем в целях безопастности использовать патч на модуль, чтоб работать с демоном через unix socket.

Аватар пользователя andribas
06.06.2011 — 21:16
1
 
 

попробую погонять Solr и сравнить время запросов, память и т.д. с sphinx,
+1 на vps он не потянет

Аватар пользователя q2_faith
05.06.2011 — 11:30
0
 
 

подпишусь

Аватар пользователя andypost
06.06.2011 — 18:08
1
 
 

Тема поиска интересна, в особенности реализация на sphinx, правда я больше ковыряю в сторону http://dgo.to/searchlight

Аватар пользователя andribas
06.06.2011 — 20:49
0
 
 

Самый интересный вопрос это схема — как ее сделать настраиваемой?

Аватар пользователя andypost
07.06.2011 — 16:33
0
 
 

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