Zend_Search_Lucene-Searching.xml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <sect1 id="zend.search.lucene.searching">
  2. <title>Pesquisando em um Índice</title>
  3. <sect2 id="zend.search.lucene.searching.query-parser">
  4. <title>Construindo Consultas</title>
  5. <para>Existem duas maneiras de pesquisar o índice. O primeiro método usa
  6. um analisador de consultas para construir a pesquisa a partir de uma
  7. string. O segundo oferece a possibilidade de criação de consultas
  8. customizadas através da API do Zend_Search_Lucene.</para>
  9. <para>Antes de decidir utilizar o analisador de consultas considere o
  10. seguinte: <orderedlist>
  11. <listitem>
  12. <para>
  13. 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.
  14. </para>
  15. </listitem>
  16. <listitem>
  17. <para>
  18. 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.
  19. </para>
  20. </listitem>
  21. <listitem>
  22. <para>
  23. 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.
  24. </para>
  25. </listitem>
  26. </orderedlist></para>
  27. <para>Ambas as formas empregam o mesmo método da API para pesquisar no
  28. índice: <programlisting role="php">&lt;?php
  29. require_once('Zend/Search/Lucene.php');
  30. $index = new Zend_Search_Lucene('/data/my_index');
  31. $index-&gt;find($query);
  32. ?&gt;</programlisting> O método <code>Zend_Search_Lucene::find()</code>
  33. determina o tipo de dado de entrada automaticamente e usa o analisador de
  34. consultas para construir um objeto Zend_Search_Lucene_Search_Query
  35. apropriado a partir da string.</para>
  36. <para>It is important to note that <code>find()</code> IS case sensitive.
  37. By default, LuceneIndexCreation.jar normalizes all documents to lowercase.
  38. This can be turned off with a command line switch (type
  39. LuceneIndexCreation.jar with no arguments for help). The case of the text
  40. supplied to <code>find()</code> must match that of the index. If the index
  41. is normalized to lowercase, then all text supplied to <code>find()</code>
  42. must pass through <code>strtolower()</code>, or else it may not
  43. match.</para>
  44. <para>É importante ressaltar que o método <code>find()</code>é sensivel à
  45. caixa. Por padrão, LuceneIndexCreation.jar normaliza todos os documentos
  46. para minúsculas. Isso pode ser desativado informando um parâmetro na linha
  47. de comando (tecle LuceneIndexCreation.jar sem argumentos para exibir a
  48. lista de opções). A caixa do texto passado a <code>find()</code>deve ser a
  49. mesma usada pelo índice. Se o índice foi normalizado para minúsculas,
  50. então o texto informado a <code>find()</code>deverá ser submetido antes a
  51. <code>strtolower()</code>, caso contrário ele poderá não ser
  52. comparado.</para>
  53. </sect2>
  54. <sect2 id="zend.search.lucene.searching.results">
  55. <title>Resultados da Pesquisa</title>
  56. <para>The search result is an array of Zend_Search_Lucene_Search_QueryHit
  57. objects. Each of these has two properties: <code>$hit-&gt;document</code>
  58. is a document number within the index and <code>$hit-&gt;score</code> is a
  59. score of the hit in a search result. Result is ordered by score (top
  60. scores come first).</para>
  61. <para>O resultado da pesquisa é um array de objetos da classe
  62. Zend_Search_Lucene_Search_QueryHit. Cada um contendo duas propriedades:
  63. <code>$hit-&gt;document</code> é um número de documento no índice e
  64. <code>$hit-&gt;score</code> é a pontuação de acertos no resultado da
  65. busca. O resultado é ordenado pela pontuação em ordem decrescente.</para>
  66. <para>O objeto Zend_Search_Lucene_Search_QueryHit também exibe cada campo
  67. do Zend_Search_Lucene_Document encontrado pela busca como uma propriedade
  68. do objeto ("hit"). No exemplo abaixo, um acerto é retornado e o documento
  69. correspondente possui dois campos: título e autor.<programlisting
  70. role="php">&lt;?php
  71. require_once('Zend/Search/Lucene.php');
  72. $index = new Zend_Search_Lucene('/data/my_index');
  73. $hits = $index-&gt;find($query);
  74. foreach ($hits as $hit) {
  75. echo $hit-&gt;id;
  76. echo $hit-&gt;score;
  77. echo $hit-&gt;title;
  78. echo $hit-&gt;author;
  79. }
  80. ?&gt;</programlisting></para>
  81. <para>Opcionalmente, o objeto Zend_Search_Lucene_Document original pode
  82. ser retornado pelo objeto Zend_Search_Lucene_Search_QueryHit. Se você
  83. consegue recuperar partes indexadas do documento usando o método
  84. <code>getDocument()</code> no índice, o documento pode ser obtido pelo
  85. método <code>getFieldValue()</code>: <programlisting role="php">&lt;?php
  86. require_once('Zend/Search/Lucene.php');
  87. $index = new Zend_Search_Lucene('/data/my_index');
  88. $hits = $index-&gt;find($query);
  89. foreach ($hits as $hit) {
  90. // return Zend_Search_Lucene_Document object for this hit
  91. echo $document = $hit-&gt;getDocument();
  92. // return a Zend_Search_Lucene_Field object
  93. // from the Zend_Search_Lucene_Document
  94. echo $document-&gt;getField('title');
  95. // return the string value of the Zend_Search_Lucene_Field object
  96. echo $document-&gt;getFieldValue('title');
  97. // same as getFieldValue()
  98. echo $document-&gt;title;
  99. }
  100. ?&gt;</programlisting> Os campos que estão contidos no objeto
  101. Zend_Search_Lucene_Document são determinados em tempo de indexação. Os
  102. campos do documento ou serão indexados ou indexador e armazenados no
  103. documento pela aplicação indexadora (por exemplo:
  104. LuceneIndexCreation.jar). </para>
  105. <para>Pay attention, that document identity ('path' in our example) is
  106. also stored in the index and must be retrieved from them.</para>
  107. <para>Note que a identidade do documento ("path" em nosso exemplo) também
  108. será armazenado no índice e deverá ser recuperado a partir do
  109. mesmo.</para>
  110. </sect2>
  111. <sect2 id="zend.search.lucene.searching.results-scoring">
  112. <title>Pontuação dos Resultados</title>
  113. <para>O módulo Zend_Search_Lucene emprega o mesmo algoritmo de pontuação
  114. adotado pelo Java Lucene. Os resultados da busca são ordenados pela
  115. respectiva pontuação em ordem decrescente.</para>
  116. <para>Em dois documentos com pontuações distintas, o que recebeu a maior
  117. pontuação contém mais termos que atendem aos requisitos da consulta do que
  118. o de pontuação menor.</para>
  119. <para>Simplificando: Pontuações maiores indicam uma frequência maior de
  120. acertos ou frases.</para>
  121. <para>A pontuação pode ser recuperada pela propriedade <code>score</code>
  122. do objeto "hit": <programlisting role="php">&lt;?php
  123. $hits = $index-&gt;find($query);
  124. foreach ($hits as $hit) {
  125. echo $hit-&gt;id;
  126. echo $hit-&gt;score;
  127. }
  128. ?&gt;</programlisting></para>
  129. <para>A classe Zend_Search_Lucene_Search_Similarity é usada para calcular
  130. a pontuação. Consulte a seção <link
  131. linkend="zend.search.lucene.extending.scoring">Extensibilidade. Algoritmos de
  132. Pontuação</link> para mais detalhes.</para>
  133. </sect2>
  134. </sect1>
  135. <!--
  136. vim:se ts=4 sw=4 et:
  137. -->