Capítulo 12. Zend_Search
Anterior |  | Próxima

## Capítulo 12. Zend_Search

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

Anterior |  | Próxima
11.6. Zend_Pdf module usage example. | Principal | 12.2. Construindo Índices