Введение в Zend Framework

 Learning Zend Framework

appendix

 Zend Framework Reference


  • Zend_Gdata
  • Zend_Http
  • Zend_InfoCard
  • Zend_Json
  • Zend_Layout
  • Zend_Ldap
  • Zend_Loader
  • Zend_Locale
  • Zend_Log
  • Zend_Mail
  • Zend_Markup
  • Zend_Measure
  • Zend_Memory
  • Zend_Mime
  • Zend_Navigation
  • Zend_Oauth
  • Zend_OpenId
  • Zend_Paginator
  • Zend_Pdf
  • Zend_ProgressBar
  • Zend_Queue
  • Zend_Reflection
  • Zend_Registry
  • Zend_Rest

  • Zend_Search_Lucene
  • Zend_Serializer
  • Zend_Server
  • Zend_Service
  • Zend_Session
  • Zend_Soap
  • Zend_Tag
  • Zend_Test
  • Zend_Text
  • Zend_TimeSync
  • Zend_Tool
  • Zend_Tool_Framework
  • Zend_Tool_Project
  • Zend_Translate
  • Zend_Uri
  • Zend_Validate
  • Zend_Version
  • Zend_View
  • Zend_Wildfire
  • Zend_XmlRpc
  • ZendX_Console_Process_Unix
  • ZendX_JQuery
  • Ttranslation 27.4% Update 2010-11-28 - Revision 23238 - Version ZF 1.11.x

    Глава 60. Zend_Search_Lucene

    Содержание

    60.1. Обзор
    60.1.1. Введение
    60.1.2. Объекты документа и поля
    60.1.3. Значение типов полей
    60.1.4. HTML-документы
    60.2. Индексация
    60.2.1. Создание нового индекса
    60.2.2. Обновление индекса
    60.2.3. Обновление документов
    60.2.4. Получение размера индекса
    60.2.5. Оптимизация индекса
    60.2.5.1. Опция автоматической оптимизации MaxBufferedDocs
    60.2.5.2. Опция автоматической оптимизации MaxMergeDocs
    60.2.5.3. Опция автоматической оптимизации MergeFactor
    60.2.6. Ограничения
    60.3. Searching an Index
    60.3.1. Building Queries
    60.3.1.1. Query Parsing
    60.3.2. Search Results
    60.3.3. Limiting the Result Set
    60.3.4. Results Scoring
    60.3.5. Search Result Sorting
    60.3.6. Search Results Highlighting
    60.4. Язык запросов
    60.4.1. Элементы
    60.4.2. Поля
    60.4.3. Модификаторы элементов
    60.4.4. Поиск по критерию близости
    60.4.5. Усиление элемента
    60.4.6. Булевы операторы
    60.4.6.1. AND
    60.4.6.2. OR
    60.4.6.3. NOT
    60.4.6.4. Операторы &&, ||, и !
    60.4.6.5. +
    60.4.6.6. -
    60.4.6.7. Отсутствие оператора
    60.4.7. Групирование
    60.4.8. Группирование полей
    60.4.9. Экранирование специальных символов
    60.5. API для построения запросов
    60.5.1. Исключения, бросаемые парсером запросов
    60.5.2. Простой запрос (запрос по одному ключевому слову)
    60.5.3. Составной запрос (запрос по нескольким ключевым словам)
    60.5.4. Фразовый запрос
    60.6. Кодировки
    60.6.1. Поддержка UTF-8 и однобайтных наборов символов
    60.6.2. Используемый по умолчанию анализатор текста
    60.6.3. Совместимый с UTF-8 анализатор текста
    60.7. Расширяемость
    60.7.1. Анализ текста
    60.7.2. Фильтрация лексем
    60.7.3. Алгоритмы ранжирования
    60.7.4. Контейнеры хранения
    60.8. Взаимодействие с Java Lucene
    60.8.1. Форматы файлов
    60.8.2. Директория для индекса
    60.8.3. Исходный код Java
    60.9. Advanced
    60.9.1. Starting from 1.6, handling index format transformations
    60.9.2. Using the index as static property
    60.10. Best Practices
    60.10.1. Field names
    60.10.2. Indexing performance
    60.10.3. Index during Shut Down
    60.10.4. Retrieving documents by unique id
    60.10.5. Memory Usage
    60.10.6. Encoding
    60.10.7. Index maintenance

    60.1. Обзор

    60.1.1. Введение

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

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

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

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

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

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

    Zend_Search_Lucene оперирует с документами как с элементарными объектами для индексации. Документ делится на именованные поля, содержащие контент, по которому может производиться поиск.

    Документ представлен объектом Zend_Search_Lucene_Document, этот объект содержит объекты Zend_Search_Lucene_Field, представляющие собой поля документа.

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

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

    Класс Zend_Search_Lucene_Field предоставляет несколько статических методов для создания полей с различными характеристиками.

    <?php <?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'));

    ?>

    Каждый из этх методов (исключая метод Zend_Search_Lucene_Field::Binary()) имеет необязательный параметр $encoding. Через него указывается кодировка для входных данных.

    Кодировка может различаться как для документов, так и для полей в одном документе.

    <?php <?php
    $doc 
    = new Zend_Search_Lucene_Document();
    $doc->addField(Zend_Search_Lucene_Field::Text('title'$title'iso-8859-1'));
    $doc->addField(Zend_Search_Lucene_Field::UnStored('contents'$contents'utf-8'));
    ?>

    Если этот параметр опущен, то используется текущая локаль. Например:

    <?php <?php
    setlocale
    (LC_ALL'de_DE.iso-8859-1');
    ...
    $doc->addField(Zend_Search_Lucene_Field::UnStored('contents'$contents));
    ?>

    Поля всегда сохраняются и возвращаются из индекса в кодировке UTF-8. Преобразование в UTF-8 производится автоматически.

    Анализатор текста (см. далее) может также преобразовывать текст в другие кодировки. В настоящее время используемый по умолчанию анализатор преобразует текст в кодировку 'ASCII//TRANSLIT'. Имейте в виду, что такое преобразование может зависеть от текущей локали.

    Имена полей могут быть любыми.

    Java Lucene по умолчанию использует для поиска поле "contents". Zend_Search_Lucene по умолчанию производит поиск по всем полям, но это поведение можно изменить. За подробностями см. Поля для поиска.

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

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

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

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

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

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

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

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

    60.1.4. HTML-документы

    Zend_Search_Lucene предоставляет возможность парсинга HTML. Документы могут создаваться непосредственно из HTML-файла или строки.

    <?php <?php
    $doc 
    Zend_Search_Lucene_Document_Html::loadHTMLFile($filename);
    $index->addDocument($doc);
    ...
    $doc Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
    $index->addDocument($doc);
    ?>

    Класс Zend_Search_Lucene_Document_Html использует методы DOMDocument::loadHTML() и DOMDocument::loadHTMLFile() для парсинга исходного HTML-кода, поэтому HTML не обязательно должен быть правильно сформированным или быть XHTML. С другой стороны, он чувствителен к кодировке, указанной в теге "meta http-equiv" заголовка.

    Класс Zend_Search_Lucene_Document_Html распознает заголовок, тело документа и его мета-теги.

    Поле 'title' будет содержать значение из /html/head/title. Оно сохраняется в индексе, разбивается на лексемы и его содержимое доступно для поиска.

    Поле 'body' будет содержать тело документа. Оно не включает в себя скрипты, комментарии и атрибуты тегов.

    Методы loadHTML() и loadHTMLFile() класса Zend_Search_Lucene_Document_Html также имеют второй необязательный аргумент. Если он установлен в true, то содержимое тела документа сохраняется в индексе и может быть получено из индекса. По умолчанию тело документа разбивается на лексемы и индексируется, но не сохраняется в индексе.

    К мета-тегам заголовка документа создаются дополнительные поля. При этом имя поля берется из атрибута 'name', содержимое поля - из атрибута 'content', это содержимое разбивается на лексемы, индексируется и сохраняется в индексе, и, таким образом, документы можно будет искать по их мета-тегам - например, по ключевым словам (keywords).

    К сгенерированным документам можно добавлять любые другие поля.

    <?php <?php
    $doc 
    Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
                                                       
    time()));
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
                                                       
    time()));
    $doc->addField(Zend_Search_Lucene_Field::Text('annotation',
                                                  
    'Document annotation text'));
    $index->addDocument($doc);
    ?>

    Линки из исходного документа не добавляются в генерируемый документ, но могут быть получены через методы Zend_Search_Lucene_Document_Html::getLinks() и Zend_Search_Lucene_Document_Html::getHeaderLinks():

    <?php <?php
    $doc 
    Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
    $linksArray $doc->getLinks();
    $headerLinksArray $doc->getHeaderLinks();
    ?>



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

    digg delicious meneame google twitter technorati facebook

    Comments

    Loading...