Глава 19. Zend_Search

Содержание

19.1. Обзор
19.1.1. Введение
19.1.2. Объекты документа и поля
19.1.3. Значение типов полей
19.2. Индексация
19.2.1. Создание нового индекса
19.2.2. Обновление индекса
19.2.3. Обновление документов
19.2.4. Оптимизация индекса
19.2.5. Ограничения
19.3. Поиск по индексу
19.3.1. Построение запросов
19.3.2. Сортировка результатов поиска
19.3.3. Результаты поиска
19.3.4. Ранжирование результата
19.4. Язык запросов
19.4.1. Элементы
19.4.2. Поля
19.4.3. Модификаторы элементов
19.4.4. Поиск по критерию близости
19.4.5. Усиление элемента
19.4.6. Булевы операторы
19.4.7. Групирование
19.4.8. Группирование полей
19.4.9. Экранирование специальных символов
19.5. Типы запросов
19.5.1. Простой запрос (запрос по одному ключевому слову)
19.5.2. Составной запрос (запрос по нескольким ключевым словам)
19.5.3. Фразовый запрос
19.6. Кодировки
19.6.1. Поддержка UTF-8 и однобайтных наборов символов
19.7. Расширяемость
19.7.1. Анализ текста
19.7.2. Фильтрация лексем
19.7.3. Алгоритмы ранжирования
19.7.4. Контейнеры хранения
19.8. Взаимодействие с Java Lucene
19.8.1. Форматы файлов
19.8.2. Директория для индекса
19.8.3. Исходный код Java
19.8.4. Использование LuceneIndexCreation.jar

19.1. Обзор

19.1.1. Введение

Zend_Search_Lucene является поисковым движком общего назначения для полнотекстового поиска, написанным полностью на PHP 5. Так как он хранит индекс в файловой системе и не требует наличия сервера баз данных, то дает возможность реализовать поиск практически для всех веб-сайтов, работающих под управлением PHP. Zend_Search_Lucene поддерживает следующие возможности:

  • Ранжированный поиск — более подходящие результаты возвращаются первыми

  • Множество типов запросов: поиск фраз, поиск с шаблонами, поиск по критерию близости, поиск по диапазону значений и т.д. [7]

  • Поиск по определенному полю (например: заголовок, автор, содержимое)

Zend_Search_Lucene произошел от проекта Apache Lucene. За более подробной информацией см. http://lucene.apache.org/java/docs/.

19.1.2. Объекты документа и поля

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". В поле с этим именем лучше всего помещать основные данные документа.

19.1.3. Значение типов полей

  • Поля Keyword полностью сохраняются и индексируются, это означает, что можно не только производить поиск в них, но и отображать их в результатах поиска. Они не делятся на отдельные слова посредством разбиения на лексемы. Нумерованные поля БД обычно преобразуются в поля Keyword в Zend_Search_Lucene.

  • В полях UnIndexed нельзя производить поиск, но они возвращаются в результатах поиска. Поля timestamp, ключевые поля, пути в файловой системе и другие внешние идентификаторы — хорошие кандидаты для того, чтобы быть полями UnIndexed.

  • Поля Binary не разбиваются на лексемы и не индексируются, но сохраняются для возвращения в результатах поиска. Они могут использоваться для хранения любых данных, закодированных в виде бинарной строки — как, например, иконки.

  • Поля Text сохраняются, разбиваются на лексемы и индексируются. Текстовые поля подходят для хранения такой информации, как темы и заголовки — в них нужно не только искать, но и возвращать с результатами поиска.

  • Поля UnStored разбиваются на лексемы и индексируются, но не сохраняются в индексе. Тексты большого объема лучше индексировать, используя этот тип поля. Хранение таких данных создает индекс, который занимает много места на диске, поэтому если нужно искать в данных, но не выводить их, то используйте поле UnStored. Поля UnStored полезны, когда используется индекс Zend_Search_Lucene в комбинации с реляционной БД. Вы можете индексировать большие поля данных для поиска с помощью UnStored и извлекать их из реляционной БД, используя отдельные поля как идентификаторы.

    Таблица 19.1. Типы Zend_Search_Lucene_Field

    Тип поля Сохраняется Индексируется Разбивается на лексемы Бинарное
    Keyword Да Да Нет Нет
    UnIndexed Да Нет Нет Нет
    Binary Да Нет Нет Да
    Text Да Да Да Нет
    UnStored Нет Да Да Нет


[7] Сейчас поддерживается поиск по одному и нескольким элементам, фразам, булевы операторы и подзапросы.