| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- <sect1 id="zend.search.lucene.searching">
- <title>Pesquisando em um Índice</title>
- <sect2 id="zend.search.lucene.searching.query-parser">
- <title>Construindo Consultas</title>
- <para>Existem duas maneiras de pesquisar o índice. O primeiro método usa
- um analisador de consultas para construir a pesquisa a partir de uma
- string. O segundo oferece a possibilidade de criação de consultas
- customizadas através da API do Zend_Search_Lucene.</para>
- <para>Antes de decidir utilizar o analisador de consultas considere o
- seguinte: <orderedlist>
- <listitem>
- <para>
- Se você pretende primeiro gerar programaticamente a string de consulta para depois submetê-la ao analisador então você deve considerar cuidadosamente a possibilidade a criação de suas consultas diretamente pela API. Em outras palavras, o analisador foi projetado para trabalhar com entradas de texto fornecidas por seres humanos e não com entradas geradas por software.
- </para>
- </listitem>
- <listitem>
- <para>
- Campos não tokenizados funcionam melhor se adicionados diretamente às consultas, do que pela ação do analisador. Se o conteúdo de um campo é gerado pela aplicação, então deveria haver um cláusula de consulta para este campo. Um interpretador, que é utilizado pelo analisador de consultas, é projetado para converter entradas de texto provenientes de seres humanos para cláusulas de busca. Valores gerados por programas, tais como datas, palavras-chave, etc., deveriam ser consistentes o suficiente para não necessitar do interpretador.
- </para>
- </listitem>
- <listitem>
- <para>
- Em um formulário de busca, somente os campos designados para receber texto deveriam ser submentidos ao analisador de consultas. Todo o resto (datas, tokens, etc.), pode ser submetido diretamente através da API de consulta. Um campo contendo um conjunto de valores, que pode ser exibido como um menu de persiana (pull-down), não deveria ser incluído na string de busca (e consequentemente submetido ao analisador), mas classificado como uma cláusula de busca.
- </para>
- </listitem>
- </orderedlist></para>
- <para>Ambas as formas empregam o mesmo método da API para pesquisar no
- índice: <programlisting role="php"><?php
- require_once('Zend/Search/Lucene.php');
- $index = new Zend_Search_Lucene('/data/my_index');
- $index->find($query);
- ?></programlisting> O método <code>Zend_Search_Lucene::find()</code>
- determina o tipo de dado de entrada automaticamente e usa o analisador de
- consultas para construir um objeto Zend_Search_Lucene_Search_Query
- apropriado a partir da string.</para>
- <para>It is important to note that <code>find()</code> IS case sensitive.
- By default, LuceneIndexCreation.jar normalizes all documents to lowercase.
- This can be turned off with a command line switch (type
- LuceneIndexCreation.jar with no arguments for help). The case of the text
- supplied to <code>find()</code> must match that of the index. If the index
- is normalized to lowercase, then all text supplied to <code>find()</code>
- must pass through <code>strtolower()</code>, or else it may not
- match.</para>
- <para>É importante ressaltar que o método <code>find()</code>é sensivel à
- caixa. Por padrão, LuceneIndexCreation.jar normaliza todos os documentos
- para minúsculas. Isso pode ser desativado informando um parâmetro na linha
- de comando (tecle LuceneIndexCreation.jar sem argumentos para exibir a
- lista de opções). A caixa do texto passado a <code>find()</code>deve ser a
- mesma usada pelo índice. Se o índice foi normalizado para minúsculas,
- então o texto informado a <code>find()</code>deverá ser submetido antes a
- <code>strtolower()</code>, caso contrário ele poderá não ser
- comparado.</para>
- </sect2>
- <sect2 id="zend.search.lucene.searching.results">
- <title>Resultados da Pesquisa</title>
- <para>The search result is an array of Zend_Search_Lucene_Search_QueryHit
- objects. Each of these has two properties: <code>$hit->document</code>
- is a document number within the index and <code>$hit->score</code> is a
- score of the hit in a search result. Result is ordered by score (top
- scores come first).</para>
- <para>O resultado da pesquisa é um array de objetos da classe
- Zend_Search_Lucene_Search_QueryHit. Cada um contendo duas propriedades:
- <code>$hit->document</code> é um número de documento no índice e
- <code>$hit->score</code> é a pontuação de acertos no resultado da
- busca. O resultado é ordenado pela pontuação em ordem decrescente.</para>
- <para>O objeto Zend_Search_Lucene_Search_QueryHit também exibe cada campo
- do Zend_Search_Lucene_Document encontrado pela busca como uma propriedade
- do objeto ("hit"). No exemplo abaixo, um acerto é retornado e o documento
- correspondente possui dois campos: título e autor.<programlisting
- role="php"><?php
- require_once('Zend/Search/Lucene.php');
- $index = new Zend_Search_Lucene('/data/my_index');
- $hits = $index->find($query);
- foreach ($hits as $hit) {
- echo $hit->id;
- echo $hit->score;
- echo $hit->title;
- echo $hit->author;
- }
- ?></programlisting></para>
- <para>Opcionalmente, o objeto Zend_Search_Lucene_Document original pode
- ser retornado pelo objeto Zend_Search_Lucene_Search_QueryHit. Se você
- consegue recuperar partes indexadas do documento usando o método
- <code>getDocument()</code> no índice, o documento pode ser obtido pelo
- método <code>getFieldValue()</code>: <programlisting role="php"><?php
- require_once('Zend/Search/Lucene.php');
- $index = new Zend_Search_Lucene('/data/my_index');
- $hits = $index->find($query);
- foreach ($hits as $hit) {
- // return Zend_Search_Lucene_Document object for this hit
- echo $document = $hit->getDocument();
- // return a Zend_Search_Lucene_Field object
- // from the Zend_Search_Lucene_Document
- echo $document->getField('title');
- // return the string value of the Zend_Search_Lucene_Field object
- echo $document->getFieldValue('title');
- // same as getFieldValue()
- echo $document->title;
- }
- ?></programlisting> Os campos que estão contidos no objeto
- Zend_Search_Lucene_Document são determinados em tempo de indexação. Os
- campos do documento ou serão indexados ou indexador e armazenados no
- documento pela aplicação indexadora (por exemplo:
- LuceneIndexCreation.jar). </para>
- <para>Pay attention, that document identity ('path' in our example) is
- also stored in the index and must be retrieved from them.</para>
- <para>Note que a identidade do documento ("path" em nosso exemplo) também
- será armazenado no índice e deverá ser recuperado a partir do
- mesmo.</para>
- </sect2>
- <sect2 id="zend.search.lucene.searching.results-scoring">
- <title>Pontuação dos Resultados</title>
- <para>O módulo Zend_Search_Lucene emprega o mesmo algoritmo de pontuação
- adotado pelo Java Lucene. Os resultados da busca são ordenados pela
- respectiva pontuação em ordem decrescente.</para>
- <para>Em dois documentos com pontuações distintas, o que recebeu a maior
- pontuação contém mais termos que atendem aos requisitos da consulta do que
- o de pontuação menor.</para>
- <para>Simplificando: Pontuações maiores indicam uma frequência maior de
- acertos ou frases.</para>
- <para>A pontuação pode ser recuperada pela propriedade <code>score</code>
- do objeto "hit": <programlisting role="php"><?php
- $hits = $index->find($query);
- foreach ($hits as $hit) {
- echo $hit->id;
- echo $hit->score;
- }
- ?></programlisting></para>
- <para>A classe Zend_Search_Lucene_Search_Similarity é usada para calcular
- a pontuação. Consulte a seção <link
- linkend="zend.search.lucene.extending.scoring">Extensibilidade. Algoritmos de
- Pontuação</link> para mais detalhes.</para>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|