Capítulo 12. Zend_Search

Índice

12.1. Visão Geral
12.1.1. Introdução
12.1.2. Objetos Documento e Campo
12.1.3. Entendendo os tipos de campos
12.2. Construindo Índices
12.2.1. Criando um Novo Índice
12.2.2. Atualizando um Índice
12.3. Pesquisando em um Índice
12.3.1. Construindo Consultas
12.3.2. Resultados da Pesquisa
12.3.3. Pontuação dos Resultados
12.4. Tipos de Consulta
12.4.1. Consulta a termo simples
12.4.2. Consulta a múltiplos termos
12.4.3. Consulta por Frase
12.5. Conjuntos de Caracteres
12.5.1. Suporte aos conjuntos de caracteres UTF-8 e byte-simples.
12.6. Extensibilidade
12.6.1. Análise de Texto
12.6.2. Algoritmos de Pontuação
12.6.3. Recipientes de Armazenagem
12.7. Interoperando com Java Lucene
12.7.1. Formatos de arquivo
12.7.2. Diretório índice
12.7.3. Código fonte Java
12.7.4. Usando LuceneIndexCreation.jar

12.1. Visão Geral

12.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[5]

  • 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/.

12.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.

12.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 12.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


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