Extensibilidade Análise de Texto A classe Zend_Search_Lucene_Analysis_Analyzer é usada pelo indexador para "tokenizar" campos de documentos de texto. Os métodos Zend_Search_Lucene_Analysis_Analyzer::getDefault() e Zend_Search_Lucene_Analysis_Analyzer::setDefault() são usados para obter e setar, respectivamente, o analisador padrão. Você pode estipular o seu próprio analisador de textos ou selecioná-lo dentre uma lista de analisadores pré-definidos: Zend_Search_Lucene_Analysis_Analyzer_Common_Text e Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive (padrão). Ambos interpretam os "tokens" como sequencias de letras. Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive converte todos os "tokens" para caixa baixa. Para selecionar um analisador: addDocument($doc); ]]> A classe Zend_Search_Lucene_Analysis_Analyzer_Common foi projetada para ser um antepassado de todos os analisadores definidos pelo usuário. O usuário só precisa definir os métodos reset() e nextToken(), que receberá a string do membro $_input e retornará os "tokens" um por um (um valor NULL indica o fim do fluxo). O método nextToken() deve chamar o método normalize() em cada "token". Isso te permite usar filtros de "token" junto com o seu analisador. Aqui está um exemplo de um analisador customizado, que aceita palavras contendo dígitos como termos: Analisador de Texto Customizado _position = 0; } /** * Tokenization stream API * Get next token * Returns null at the end of stream * * @return Zend_Search_Lucene_Analysis_Token|null */ public function nextToken() { if ($this->_input === null) { return null; } while ($this->_position < strlen($this->_input)) { // skip white space while ($this->_position < strlen($this->_input) && !ctype_alnum( $this->_input[$this->_position] )) { $this->_position++; } $termStartPosition = $this->_position; // read token while ($this->_position < strlen($this->_input) && ctype_alnum( $this->_input[$this->_position] )) { $this->_position++; } // Empty token, end of stream. if ($this->_position == $termStartPosition) { return null; } $token = new Zend_Search_Lucene_Analysis_Token( substr($this->_input, $termStartPosition, $this->_position - $termStartPosition), $termStartPosition, $this->_position); $token = $this->normalize($token); if ($token !== null) { return $token; } // Continue if token is skipped } return null; } } Zend_Search_Lucene_Analysis_Analyzer::setDefault( new My_Analyzer()); ]]> Tokens Filtering The Zend_Search_Lucene_Analysis_Analyzer_Common analyzer also offers a token filtering mechanism. The Zend_Search_Lucene_Analysis_TokenFilter class provides an abstract interface for such filters. Your own filters should extend this class either directly or indirectly. Any custom filter must implement the normalize() method which may transform input token or signal that the current token should be skipped. There are three filters already defined in the analysis subpackage: Zend_Search_Lucene_Analysis_TokenFilter_LowerCase Zend_Search_Lucene_Analysis_TokenFilter_ShortWords Zend_Search_Lucene_Analysis_TokenFilter_StopWords The LowerCase filter is already used for Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive analyzer by default. The ShortWords and StopWords filters may be used with pre-defined or custom analyzers like this: addFilter($stopWordsFilter); Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer); ]]> addFilter($shortWordsFilter); Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer); ]]> The Zend_Search_Lucene_Analysis_TokenFilter_StopWords constructor takes an array of stop-words as an input. But stop-words may be also loaded from a file: loadFromFile($my_stopwords_file); $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive(); $analyzer->addFilter($stopWordsFilter); Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer); ]]> This file should be a common text file with one word in each line. The '#' character marks a line as a comment. The Zend_Search_Lucene_Analysis_TokenFilter_ShortWords constructor has one optional argument. This is the word length limit, set by default to 2. Algoritmos de Pontuação A pontuação de um documento d para uma consulta q é definida como segue: score(q,d) = sum( tf(t in d) * idf(t) * getBoost(t.field in d) * lengthNorm(t.field in d) ) * coord(q,d) * queryNorm(q) tf(t in d) - Zend_Search_Lucene_Search_Similarity::tf($freq) - um fator de pontuação baseado na frequência de um termo ou frase em um documento. idf(t) - Zend_Search_Lucene_Search_Similarity::idf($input, $reader) - um fator de pontuação para um termo simples com o índice especificado. getBoost(t.field in d) - o fator de reforço para o campo. lengthNorm($term) - O valor de normalização para um campo, dado o número total de termos contido nele. Este valor é armazenado junto com o índice. Estes valores, juntamente com os campos de reforço, são armazenados em um índice e multiplicados nas pontuações de acerto em cada campo, pelo código de busca. Comparações em campos longos são menos precisas, e implementações deste método usualmente retornam valores pequenos quando o número de "tokens" é grande, e valores grandes quando o número de "tokens" for pequeno. coord(q,d) - Zend_Search_Lucene_Search_Similarity::coord($overlap, $maxOverlap) - um fator de pontuação baseado no quociente de todos os termos de busca que um documento contém. A existência de uma grande quantidade de termos de busca indica um grau maior de comparação. As implementações deste método usualmente retornam valores significativos quando a razão entre estes parâmetros é grande e vice versa. queryNorm(q) - o valor de normalização para uma consulta dado a soma das relevâncias ao quadrado de cada termo da consulta. Este valor é então multiplicado pela relevância de cada item da consulta. Isto não afeta a pontuação, mas a quantidade de tentativas para gerar pontuações em comparações entre consultas. O algoritmo de pontuação pode ser customizado pela implementação da sua própria classe de similaridade. Para isso crie uma classe descendente de Zend_Search_Lucene_Search_Similarity como mostrado abaixo, então use o método Zend_Search_Lucene_Search_Similarity::setDefault($similarity); para defini-la como padrão. Recipientes de Armazenagem A classe abstrata Zend_Search_Lucene_Storage_Directory define a funcionalidade de diretório. O construtor do Zend_Search_Lucene usa como entrada uma string ou um objeto da classe Zend_Search_Lucene_Storage_Directory. A classe Zend_Search_Lucene_Storage_Directory_Filesystem implementa a funcionalidade de diretório para o sistema de arquivos. Se uma string for usada como entrada para o construtor do Zend_Search_Lucene, então o leitor do índice (um objeto Zend_Search_Lucene) a tratará como um caminho para o sistema de arquivos e instanciará um objeto Zend_Search_Lucene_Storage_Directory_Filesystem. Você pode definir a sua própria implementação de diretório estendendo a classe Zend_Search_Lucene_Storage_Directory. Métodos de Zend_Search_Lucene_Storage_Directory: O método getFileObject($filename) de uma instância Zend_Search_Lucene_Storage_Directory retorna um objeto Zend_Search_Lucene_Storage_File. A classe abstrata Zend_Search_Lucene_Storage_File implementa a abstração de arquivo e as primitivas de leitura de arquivos de índice. Se fizer isso, você também terá que estender Zend_Search_Lucene_Storage_File para a sua implementação de diretório. Somente dois métodos de Zend_Search_Lucene_Storage_File devem ser substituídos em sua implementação: