Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Серверные службы Linux

Реализация поискового движка на Xapian и Omega

Оригинал: Adding search to your Web site with Xapian and Omega
Автор: Ben Martin
Дата: 3 октября 2008
Перевод: Александр Тарасов aka oioki
Дата перевода: 19 октября 2008

С помощью Xapian и Omega можно быстро построить мощный поисковой движок веб-сайта. Можно будет индексировать файлы HTML, PDF и PHP, а затем производить поиск по словам, содержащимся в документах, или в метаданных.

Разделяемая библиотека, которая собственно реализует индексацию, называется Xapian. Omega - это набор программных средств от команды Xapian, которые позволяют воспользоваться возможностями индексации библиотеки Xapian, если вы сами не являетесь разработчиком. Omega использует Xapian, поэтому при установке Omega из репозитория своего дистрибутива Xapian доставится автоматически как зависимый пакет.

Я установил пакет Xapian, а Omega собрал из исходников версии 1.0.8, на 64-битной машине с установленной Fedora 9. Сборка осуществляется как обычно: ./configure; make; sudo make install. Помимо самой программы будут установлены файлы документации, конфигурационный файл и man-страницы. Далее, для установки поискового веб-интерфейса нужно отдать следующие команды:

# mkdir -p /var/lib/omega/data/default
# cp -av xapian-omega-1.0.8/templates /var/lib/omega
# chown -R root.apache /var/lib/omega
# find /var/lib/omega -exec chmod +s {} \;
# cp -av /usr/local/lib/xapian-omega/bin/omega /var/www/cgi-bin

Здесь сначала шаблоны Omega копируются в каталог /var/lib, где Omega их ищет по умолчанию. Права этого каталога устанавливаются таким образом, чтобы пользователь apache имел к нему доступ, также устанавливается sticky bit, для того чтобы новые файлы, создаваемые Omega, приобретали необходимые права для группы apache. Последняя команда помещает исполняемый файл omega в каталог cgi-bin, чтобы можно было запускать Omega через веб-браузер.

Приступим

Для создания, наполнения и обновления индексов Omega использует собственную команду omindex. Omega позволяет иметь сразу несколько индексов, каждый из которых будет храниться в своем каталоге. В командах, которые последуют далее, я буду использовать путь расположения индекса по умолчанию. Необходимо указать, где Omega будет хранить индекс, URL или относительный путь индексируемого веб-сайта, и путь к файлам, которые вы хотите индексировать. Вызов omindex, показанный ниже, создаст индекс, содержащий все файлы в корне веб-сайта (в конфигурационном файле Apache этот путь хранится в переменной DocumentRoot). Чтобы проиндексировать весь веб-сервер, --url нужно указать как /.

# grep DocumentRoot /etc/httpd/conf/httpd.conf
...
DocumentRoot "/var/www/html"
...
# omindex --db /var/lib/omega/data/default --url / /var/www/html

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

Допустим, у нас есть файлы Linux HOWTO и бизнес веб-сайт, обслуживаемый из одного DocumentRoot. Следующие команды проиндексируют эти сайты с помощью Omega, отдельно друг от друга. После этого поиск можно будет вести отдельно, что и требуется.

# omindex --db /var/lib/omega/data/default \
  --preserve-nonduplicates \
  --url /howto \
  /var/www/html/howto
# omindex --db /var/lib/omega/data/default \
  --preserve-nonduplicates \
  --url /mysite \
  /var/www/html/mysite

При запуске Omega из индекса будут удалены все документы, которые не будут найдены в файловой системе. Если вы запускаете Omega на одном единственном сайте, тогда это поведение в точности вам подходит, ведь если файл удален из файловой системы, значит нужно его удалить и из индекса (чтоб пользователя не смущали мертвые ссылки). Однако при запуске на нескольких сайтах (как в нашем примере), тогда нужно заставить программу оставлять файлы в индексе даже когда их не существует - ведь программа не видит эти файлы в процессе индексации другого сайта; поэтому мы пишем опцию --preserve-nonduplicates. С этой опцией при индексации второго URL-адреса, а именно mysite, Omega не будет удалять записи индекса для файлов из howto, хотя они и не находятся в текущем процессе индексации.

Другим преимуществом вышеприведенных команд является то, что вы можете обновлять индекс веб-сайта независимо для обеих сайтов. Если один из сайтов очень большой, тогда можно указать, чтобы Omega обновляла лишь один подкаталог, как это сделать - показано ниже. Обратите внимание, что URL-адрес и путь поиска должны оставаться такими же; вы же просто добавляете подкаталог, который необходимо обновить в данный момент.

# omindex --db /var/lib/omega/data/default \
  --url /mysite \
  --preserve-nonduplicates \
  /var/www/html/mysite \
  quickly/changing/dir

Сама по себе Omega поддерживает индексацию файлов многих типов. Естественно, поддерживаются HTML, обычный текст и PHP; но помимо этого Omega может работать с PDF, PostScript, OpenOffice.org, Microsoft Office, AbiWord, RTF, DjVu и другими форматами, даже экзотическими, типа Perl POD и файлы TeX DVI.

Добавив документы в индекс Omega, можно будет проверить возможность поиска с помощью приведенной ниже команды. Убедитесь, что положили исполняемый файл omega куда нужно. Я к примеру обнаружил, что по умолчанию брался одноименный исполняемый файл omega из пакета верстки texlive, и система естественно запускала эту программу, а не поисковик. Поэтому мне пришлось писать полный путь к нужной omega. Следующая команда выполняет полнотекстовый поиск по слову "load", поиск ведется по индексу, созданному командой выше.

# /usr/local/lib/xapian-omega/bin/omega 'P=load' HITSPERPAGE=10

Этот же исполняемый файл исопльзуется и в CGI-интерфейсе, вот почему приходится в вызове программы указывать родной для CGI префикс 'P='. Теперь вы знаете, что Omega построила индекс, и можно выполнять поисковые запросы, а значит можно попробовать веб-интерфейс. Рекомендуется проделать этот шаг (консольный) перед пробой веб-интерфейса, потому что если вдруг веб-интерфейс не заработает, вы будете знать, что причина не в том, что не работает сама Omega. Чтоб вызвать веб-интерфейс, наберите URL-адрес http://localhost/cgi-bin/omega в своем веб-браузере. На приведенном ниже снимке экрана показан поисковой интерфейс Omega, которым мы воспользовались для поиска документов HOWTO.

Синтаксис запросов Omega включает поддержку булевых операторов AND, OR, XOR и NOT. Можно также пользоваться + и -, чтобы указывать, какие слова должны, а какие не должны присутствовать в результатах поиска. Если не указывать модификаторов + и -, тогда Omega сама решит, насколько данный документ удовлетворяет запросу - некоторые слова вообще могут не встретиться в результате поиска. Ключевые слова NEAR и ADJ позволяют искать документы, в которых указанные слова расположены близко друг к другу. Разницей между этими словами является то, что для ADJ важен порядок - слово, указанное перед ADJ, должно появиться в тексте документа до слова, указанного после ADJ. Для NEAR слова просто должны быть рядом, независимо от того, в каком порядке. Критерий "рядом" для NEAR и ADJ в данном случае означает 10 слов - это значение по умолчанию. Но можно указать и другое расстояние, добавив модификатор /n сразу после NEAR или ADJ, здесь n как раз означает количество слов, которые могут быть между искомыми словами.

Можно вести поиск по точной фразе, заключая ее в двойные кавычки. Слова запроса, содержащие слеши или символы @ - автоматически считаются как запросы по точной фразе. Если ваше поисковое слово содержит заглавные буквы, Omega считает, что вы знаете как точно пишется слово, и поэтому стемминг не производится. Однако обычно текст в индексе проходит через процесс стемминга, в котором слово преобразуется к своей более простой форме. К примеру, три слова stemmer, stemming и stemmed преобразуются в более простую форму stem. Более подробные разъяснения можно найти на странице синтаксиса Omega.

Помимо этого Omega индексирует метаданные каждого файла. Можно включать эти метаданные в свой запрос, и таким образом ограничивать результаты поиска - нужно начать слово запроса с заглавной буквы и добавить слово метаданных. К примеру, файлы, проиндексированные omindex с ключом --url /howto приобретают поле метаданных pathname, содержащее значение /howto. Если хотите найти страницы об Ethernet, и ваш индекс Omega хранит множество веб-сайтов, но вы хотите искать только в документах HOWTO, можно воспользоваться запросом P/howto. Здесь P - это префикс для поля pathname. Другие префиксы можно найти на странице документации.

Можно сменить шаблон оформления, изменив CGI-параметр FMT, использующийся в вызове omega. Параметр FMT хранит "формат" страницы, который вы хотите использовать с Omega.

Примером использования параметра FMT может быть включение формата страницы "topterms". В этом случае Omega будет предполагать, какие другие слова близки по смыслу с текущим запросом, что поможет вам найти, что нужно и разобраться в теме. Использование формата "godmode" позволяет искать документ по идентификатору и видеть список слов запроса, хранящихся в каждом из этих документов. Конечно, список слов запроса (отдельных слов) для документа может быть очень длинным, поэтому режим godmode нужно использовать с осторожностью (или вообще отключить его), чтобы пользователи не грузили вашу систему. Однако этот режим полезен при изучении новых мощных способностей языка запросов Omega. Формат "xml" позволяет Omega выводить результат поиска в XML-формате, а не в виде обычной HTML-страницы.

С использованием Xapian и Omega можно создать поисковой движок для полнотекстового поиска и поиск по метаданным вашего веб-сайта. Можно использовать формат вывода XML для получения данных из Omega. После этого обрабатывать результат своими средствами и выводить его на сайт, таким образом пользователю не придется обращаться к самой CGI-программе. Помимо этого, внешний вид вашего сайта уже не будет зависеть от внешнего вида стандартной поисковой странички Omega. Xapian и Omega поддерживает дополнительные функции, такие как поиск по близким словам, способные улучшить результаты поиска для пользователей.