27.2. Construindo Índices

27.2.1. Criando um Novo Índice

As funcionalidades de criação e atualização de índices são implementadas tanto pelo módulo Zend_Search_Lucene quanto pelo Java Lucene. Você pode usar ambas as funcionalidades.

O código PHP abaixo mostra um exemplo de como indexar um arquivo usando a API de indexação do Zend_Search_Lucene:

<?php

// Setting the second argument to TRUE creates a new index
$index = new Zend_Search_Lucene('/data/my-index', true);

$doc = new Zend_Search_Lucene_Document();

// Store document URL to identify it in search result.
$doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));

// Index document content
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));

// Add document to the index.
$index->addDocument($doc);

// Write changes to the index.
$index->commit();
?>

Documentos adicionados recentemente devem ser pesquisados no índice somente após um "commit" ter sido executado.

O método Zend_Search_Lucene::commit() é chamado automaticamente ao final da execução do script e antes de qualquer operação de busca.

Cada chamada a método commit() gera um novo segmento de índice. Ele deve ser usado raramente, se possível. Observe também que executar "commit" em uma grande quantidade de documentos, em um único passo, consome mais memória.

O gerenciamento e a otimização de segmentos de forma automatica é um assunto para ser tratado em futuros aprimoramentos do módulo Zend_Search_Lucene.

27.2.2. Atualizando um Índice

O mesmo procedimento é empregado para atualizar um índice existente. A única diferença é que o índice deverá ser aberto sem o segundo parâmetro:

<?php

// Open existing index
$index = new Zend_Search_Lucene('/data/my-index');

$doc = new Zend_Search_Lucene_Document();
// Store document URL to identify it in search result.
$doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
// Index document content
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));

// Add document to the index.
$index->addDocument($doc);

// Write changes to the index.
$index->commit();
?>

Cada chamada a commit() (explícita ou implícita) gera um novo segmento de índice.

Zend_Search_Lucene não gerencia segmentos automaticamente. Então é tarefa do programador observar o tamanho dos segmentos. De um lado, segmentos grandes são mais otimizados, mas por outro, eles consomem mais memória durante sua criação.

Lucene Java e Luke (Lucene Index Toolbox - http://www.getopt.org/luke/) podem ser usados para otimizar índices juntamente com esta versão do Zend_Search_Lucene.