Содержание
Zend_Search_Lucene является поисковым движком общего назначения для полнотекстового поиска, написанным полностью на PHP 5. Так как он хранит индекс в файловой системе и не требует наличия сервера баз данных, то дает возможность реализовать поиск практически для всех веб-сайтов, работающих под управлением PHP. Zend_Search_Lucene поддерживает следующие возможности:
Ранжированный поиск — более подходящие результаты возвращаются первыми
Множество типов запросов: поиск фраз, поиск с шаблонами, поиск по критерию близости, поиск по диапазону значений и т.д. [7]
Поиск по определенному полю (например: заголовок, автор, содержимое)
Zend_Search_Lucene произошел от проекта Apache Lucene. За более подробной информацией см. http://lucene.apache.org/java/docs/.
Zend_Search_Lucene оперирует с документами как с элементарными объектами для индексации. Документ делится на именованные поля, содержащие контент, по которому может производиться поиск.
Документ представлен объектом Zend_Search_Lucene_Document, этот объект содержит объекты Zend_Search_Lucene_Field, представляющие собой поля документа.
Важно отметить, что в индекс может быть добавлена любая информация. Данные вашего приложения или метаданные могут сохраняться в полях документа и после извлекаться вместе с документом в процессе поиска.
Приложение отвественно за процесс индексации. Как следствие, проиндексированы могут быть данные из любых источников, доступных приложению. Например, это могут быть файловая система, база данных, форма HTML и т.д.
Класс Zend_Search_Lucene_Field
предоставляет
несколько статических методов для создания полей с различными
характеристиками.
<?php $doc = new Zend_Search_Lucene_Document(); // Данные поля не разбиваются на лексемы, // но индексируются и полностью сохраняются в индексе. // Сохраненные данные поля могут быть получены из индекса. $doc->addField(Zend_Search_Lucene_Field::Keyword('doctype', 'autogenerated')); // Данные поля не разбиваются на лексемы и не индексируются, // но полностью сохраняются в индексе. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created', time())); // Бинарное поле, данные которого не разбиваются на лексемы и не индексируются, // но сохраняются в индексе. $doc->addField(Zend_Search_Lucene_Field::Binary('icon', $iconData)); // Данные поля разбиваются на лексемы, индексируются // и полностью сохраняются в индексе. $doc->addField(Zend_Search_Lucene_Field::Text('annotation', 'Document annotation text')); // Данные поля разбиваются на лексемы и индексируются, // но не сохраняются в индексе. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 'My document content')); ?>
Вы можете давать имена полям по своему усмотрению. По умолчанию для поиска используется поле с именем "contents". В поле с этим именем лучше всего помещать основные данные документа.
Поля Keyword
полностью сохраняются и индексируются,
это означает, что можно не только производить поиск в них,
но и отображать их в результатах поиска.
Они не делятся на отдельные слова посредством разбиения
на лексемы. Нумерованные поля БД обычно преобразуются в поля Keyword
в Zend_Search_Lucene.
В полях UnIndexed
нельзя производить поиск,
но они возвращаются в результатах поиска. Поля timestamp,
ключевые поля, пути в файловой системе и другие
внешние идентификаторы — хорошие кандидаты для того, чтобы
быть полями UnIndexed.
Поля Binary
не разбиваются на лексемы и не индексируются,
но сохраняются для возвращения в результатах поиска.
Они могут использоваться для хранения любых данных,
закодированных в виде бинарной строки — как, например,
иконки.
Поля Text
сохраняются, разбиваются на лексемы
и индексируются. Текстовые поля подходят для хранения
такой информации, как темы и заголовки — в них нужно не
только искать, но и возвращать с результатами поиска.
Поля UnStored
разбиваются на лексемы и индексируются, но
не сохраняются в индексе. Тексты большого объема лучше
индексировать, используя этот тип поля.
Хранение таких данных создает индекс, который занимает много места
на диске, поэтому если нужно искать в данных, но не выводить их, то
используйте поле UnStored. Поля UnStored полезны,
когда используется индекс Zend_Search_Lucene в
комбинации с реляционной БД. Вы можете индексировать большие
поля данных для поиска с помощью UnStored и извлекать их
из реляционной БД, используя отдельные поля как
идентификаторы.
[7] Сейчас поддерживается поиск по одному и нескольким элементам, фразам, булевы операторы и подзапросы.