Capítulo 27. Zend_Search_Lucene

Índice

27.1. Visão Geral
27.1.1. Introdução
27.1.2. Objetos Documento e Campo
27.1.3. Entendendo os tipos de campos
27.2. Construindo Índices
27.2.1. Criando um Novo Índice
27.2.2. Atualizando um Índice
27.3. Pesquisando em um Índice
27.3.1. Construindo Consultas
27.3.2. Resultados da Pesquisa
27.3.3. Pontuação dos Resultados
27.4. Query Language
27.4.1. Terms
27.4.2. Fields
27.4.3. Term Modifiers
27.4.4. Proximity Searches
27.4.5. Boosting a Term
27.4.6. Boolean Operators
27.4.7. Grouping
27.4.8. Field Grouping
27.4.9. Escaping Special Characters
27.5. Tipos de Consulta
27.5.1. Consulta a termo simples
27.5.2. Consulta a múltiplos termos
27.5.3. Consulta por Frase
27.6. Conjuntos de Caracteres
27.6.1. Suporte aos conjuntos de caracteres UTF-8 e byte-simples.
27.7. Extensibilidade
27.7.1. Análise de Texto
27.7.2. Algoritmos de Pontuação
27.7.3. Recipientes de Armazenagem
27.8. Interoperando com Java Lucene
27.8.1. Formatos de arquivo
27.8.2. Diretório índice
27.8.3. Código fonte Java
27.8.4. Usando LuceneIndexCreation.jar
27.9. Advanced
27.9.1. Using index as static property

27.1. Visão Geral

27.1.1. Introdução

Zend_Search_Lucene é um mecanismo para pesquisa de texto, de propósito geral, escrito totalmente em PHP 5. Por armazenar os índices no sistema de arquivos e não fazer uso de servidor de banco de dados, ele pode efetuar pesquisas em qualquer website rodando php. O Zend_Search_Lucene possui os seguintes recursos:

  • Pesquisa agrupada por pontuação (ranked) - os resultados mais prováveis são retornados primeiro

  • Consultas poderosas de diversos tipos: frase, curingas, aproximação, faixas e muito mais[7]

  • Busca por campo específico (ex: título, autor, descrição)

Zend_Search_Lucene derivou do projeto Apache Lucene. Para mais informações, visite http://lucene.apache.org/java/docs/.

27.1.2. Objetos Documento e Campo

Zend_Search_Lucene trabalha sobre os documentos subdividindo-os em pequenas operações (atômicas) de indexação. Um documento é dividido em campos identificados cujo conteúdo é pesquisado.

Um documento é representado por um objeto da classe Zend_Search_Lucene_Document, que por sua vez contém objetos da classe Zend_Search_Lucene_Field que representam os campos.

O que é importante ressaltar é que qualquer tipo de informação pode ser adicionada a um índice. Informações específicas de aplicações ou metadados podem ser armazenados em campos de um documento, e posteriormente recuperados juntamente com o documento durante uma pesquisa.

Controlar o indexador é responsabilidade de sua aplicação. Este recurso garante que os dados possam ser indexados a partir de qualquer fonte que seja acessível à sua aplicação. Por exemplo, um sistema de arquivos, um banco de dados, um formulário HTML, etc.

A classe Zend_Search_Lucene_Field provê alguns métodos estáticos para criação de campos com diferentes características:

<?php
$doc = new Zend_Search_Lucene_Document();

// Field is not tokenized, but is indexed and stored within the index.
// Stored fields can be retrived from the index.
$doc->addField(Zend_Search_Lucene_Field::Keyword('doctype', 
                                                 'autogenerated'));

// Field is not tokenized nor indexed, but is stored in the index.
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created', 
                                                   time()));

// Binary String valued Field that is not tokenized nor indexed,
// but is stored in the index.
$doc->addField(Zend_Search_Lucene_Field::Binary('icon', 
                                                $iconData));

// Field is tokenized and indexed, and is stored in the index.
$doc->addField(Zend_Search_Lucene_Field::Text('annotation', 
                                              'Document annotation text'));

// Field is tokenized and indexed, but that is not stored in the index.
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 
                                                  'My document content'));

?>

Você pode dar nome aos campos de acordo com a sua preferência. Um campo chamado "contents" pode ser usado para a pesquisa "default". É uma boa prática colocar os dados principais do documento em um campo com este nome.

27.1.3. Entendendo os tipos de campos

  • Campos do tipo Keyword são armazenados e indexados ***fields are stored and indexed***, meaning they can be searched as well as displayed them back in search results. They are not split up into seperate words by tokenization. Enumerated database fields usually translate well to Keyword fields in Zend_Search_Lucene.

  • Campos do tipo UnIndexed não são pesquisáveis, mas são retornados junto com os resultados das pesquisas. Database timestamps, chaves primárias, caminhos do sistema de arquivos, e outros identificadores externos são bons candidatos para campos UnIndexed.

  • Campos do tipo Binary não são avaliados nem indexados, mas são armazenados para serem retornados em resultados de pesquisas. Eles podem ser usados para armazenar qulaquer tipo de dado que possa ser codificados em uma string binária, por exemplo, um ícone.

  • Campos do tipo Text são armazenados, indexados e avaliados. Campos texto são apropriados para conter informações que devam ser pesquisadas, bem como retornadas por uma pesquisa, tais como descrições e títulos.

  • Campos do tipo UnStored são avaliados e indexados, mas não são armazenados no índice. Grandes quantidades de texto são melhor indexadas utilizando este tipo de campo. Dados armazenados criam um extenso índice no disco, então se você necessitar pesquisar sem exibir estes dados, utilize um campo UnStored. Campos UnStored são úteis quando utilizamos um índice Zend_Search_Lucene em combinação com um banco de dados relacional. Você pode indexar campos contendo dados volumosos usando campos UnStored para pesquisa, e recuperá-los a partir de um banco de dados relacional usando campos separados como identificadores.

    Tabela 27.1. Campos Zend_Search_Lucene_Field

    Tipo de Campo Armazenado Indexado Tokenizado Binário
    Keyword Sim Sim Não Não
    UnIndexed Sim Não Não Não
    Binary Sim Não Não Sim
    Text Sim Sim Sim Não
    UnStored Não Sim Sim Não


[7] Por enquanto, apenas as consultas por termo e termos múltiplos são suportadas.