Zend_Search_Lucene-Extending.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <sect1 id="zend.search.lucene.extending">
  2. <title>Extensibilidade</title>
  3. <sect2 id="zend.search.lucene.extending.analysis">
  4. <title>Análise de Texto</title>
  5. <para>A classe <code>Zend_Search_Lucene_Analysis_Analyzer</code> class é
  6. usada pelo indexador para "tokenizar" campos de documentos de
  7. texto.</para>
  8. <para>Os métodos
  9. <code>Zend_Search_Lucene_Analysis_Analyzer::getDefault()</code> e
  10. <code>Zend_Search_Lucene_Analysis_Analyzer::setDefault()</code> são usados
  11. para obter e setar, respectivamente, o analisador padrão.</para>
  12. <para>Dessa forma você pode estipular o seu próprio analisador de textos
  13. ou selecioná-lo dentre uma lista de analisadores prédefinidos:
  14. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text</code> e
  15. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive</code>
  16. (default). Ambos interpretam um "token" como uma sequencia de letras.
  17. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive</code>
  18. converte os "tokens" para caixa baixa.</para>
  19. <para>Para selecionar um analisador utilize o código:</para>
  20. <programlisting role="php">&lt;?php
  21. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  22. new Zend_Search_Lucene_Analysis_Analyzer_Common_Text());
  23. ...
  24. $index-&gt;addDocument($doc);
  25. ?&gt;</programlisting>
  26. <para><code>Zend_Search_Lucene_Analysis_Analyzer_Common</code> foi
  27. projetado ser o pai de todos os analisadores definidos pelo usuário. O
  28. usuário só precisa definir o método <code>tokenize()</code>, que receberá
  29. os dados de entrada como uma string e retornará um array de
  30. "tokens".</para>
  31. <para>O método <code>tokenize()</code> deve aplicar o método
  32. <code>normalize()</code> a todos os "tokens". Ele permite o uso de filtros
  33. de "token" junto com o seu analisador.</para>
  34. <para>Aqui está um exemplo de um analisador customizado, que aceita tanto
  35. palavras contendo digitos tratando-as como um único termo: <example>
  36. <title>Analisador de texto customizado.</title>
  37. <programlisting role="php">&lt;?php
  38. /** Here is a custome text analyser, which treats words with digits as one term */
  39. /** Zend_Search_Lucene_Analysis_Analyzer_Common */
  40. require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common.php';
  41. class My_Analyzer extends Zend_Search_Lucene_Analysis_Analyzer_Common
  42. {
  43. /**
  44. * Tokenize text to a terms
  45. * Returns array of Zend_Search_Lucene_Analysis_Token objects
  46. *
  47. * @param string $data
  48. * @return array
  49. */
  50. public function tokenize($data)
  51. {
  52. $tokenStream = array();
  53. $position = 0;
  54. while ($position &lt; strlen($data)) {
  55. // skip white space
  56. while ($position &lt; strlen($data) &amp;&amp; !ctype_alpha($data{$position}) &amp;&amp; !ctype_digit($data{$position})) {
  57. $position++;
  58. }
  59. $termStartPosition = $position;
  60. // read token
  61. while ($position &lt; strlen($data) &amp;&amp; (ctype_alpha($data{$position}) || ctype_digit($data{$position}))) {
  62. $position++;
  63. }
  64. // Empty token, end of stream.
  65. if ($position == $termStartPosition) {
  66. break;
  67. }
  68. $token = new Zend_Search_Lucene_Analysis_Token(substr($data,
  69. $termStartPosition,
  70. $position-$termStartPosition),
  71. $termStartPosition,
  72. $position);
  73. $tokenStream[] = $this-&gt;normalize($token);
  74. }
  75. return $tokenStream;
  76. }
  77. }
  78. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  79. new My_Analyzer());
  80. ?&gt;</programlisting>
  81. </example></para>
  82. </sect2>
  83. <sect2 id="zend.search.lucene.extending.scoring">
  84. <title>Algoritmos de Pontuação</title>
  85. <para>A pontuação da consulta <code>q</code> para o documento
  86. <code>d</code> é definida como segue:</para>
  87. <para><code>score(q,d) = sum( tf(t in d) * idf(t) * getBoost(t.field in d)
  88. * lengthNorm(t.field in d) ) * coord(q,d) * queryNorm(q)</code></para>
  89. <para>tf(t in d) -
  90. <code>Zend_Search_Lucene_Search_Similarity::tf($freq)</code> - um fator de
  91. pontuação baseado na frequência de um termo ou frase em um
  92. documento.</para>
  93. <para>idf(t) -
  94. <code>Zend_Search_Lucene_Search_SimilaritySimilarity::tf($term,
  95. $reader)</code> - um fator de pontuação para um termo simples para o
  96. índice especificado.</para>
  97. <para>getBoost(t.field in d) - fator de reforço para o campo.</para>
  98. <para>lengthNorm($term) - O valor de normalização para um campo, dado o
  99. número total de termos contido nele. Este valor é armazenado junto com o
  100. índice. Estes valores, juntamente com os campos de reforço, são
  101. armazenados em um índice e multiplicados nas pontuações de acerto em cada
  102. campo, pelo código de busca.</para>
  103. <para>Comparações em campos longos são menos precisas, e implementações
  104. deste método usualmente retornam valores pequenos quando o número de
  105. "tokens" é grande, e valores gradnes quando o número de "tokens" for
  106. pequeno.</para>
  107. <para>coord(q,d) -
  108. <code>Zend_Search_Lucene_Search_Similarity::coord($overlap,
  109. $maxOverlap)</code> - um fator de pontuação baseado no quociente de todos
  110. os termos de busca que um documento contém.</para>
  111. <para>The presence of a large portion of the query terms indicates a
  112. better match with the query, so implementations of this method usually
  113. return larger values when the ratio between these parameters is large and
  114. smaller values when the ratio between them is small.</para>
  115. <para>A existência de uma grande quantidade de termos de busca indica um
  116. grau maior de comparação. As implementações deste método usualmente
  117. retornam valores significativos quando a razão entre estes parâmetros é
  118. grande e vice versa. </para>
  119. <para>queryNorm(q) - o valor de normalização para uma consulta dado a soma
  120. dos (squared weights) de cada termo da consulta. Este valor é então
  121. multiplicado pelo (weight) de cada ítem da consulta.</para>
  122. <para>Isto não afeta a pontuação, mas a quantidade de tentativas para
  123. gerar pontuações em comparações entre consultas.</para>
  124. <para>O algoritmo de pontuação pode ser customizado pela implementação da
  125. sua própria classe de similaridade. Para isso crie uma classe descendente
  126. de Zend_Search_Lucene_Search_Similarity como mostrado abaixo, então use o
  127. método
  128. <code>Zend_Search_Lucene_Search_Similarity::setDefault($similarity);</code>
  129. para defini-la como padrão.</para>
  130. <programlisting role="php">&lt;?php
  131. class MySimilarity extends Zend_Search_Lucene_Search_Similarity {
  132. public function lengthNorm($fieldName, $numTerms) {
  133. return 1.0/sqrt($numTerms);
  134. }
  135. public function queryNorm($sumOfSquaredWeights) {
  136. return 1.0/sqrt($sumOfSquaredWeights);
  137. }
  138. public function tf($freq) {
  139. return sqrt($freq);
  140. }
  141. /**
  142. * It's not used now. Computes the amount of a sloppy phrase match,
  143. * based on an edit distance.
  144. */
  145. public function sloppyFreq($distance) {
  146. return 1.0;
  147. }
  148. public function idfFreq($docFreq, $numDocs) {
  149. return log($numDocs/(float)($docFreq+1)) + 1.0;
  150. }
  151. public function coord($overlap, $maxOverlap) {
  152. return $overlap/(float)$maxOverlap;
  153. }
  154. }
  155. $mySimilarity = new MySimilarity();
  156. Zend_Search_Lucene_Search_Similarity::setDefault($mySimilarity);
  157. ?&gt;</programlisting>
  158. </sect2>
  159. <sect2 id="zend.search.lucene.extending.storage">
  160. <title>Recipientes de Armazenagem</title>
  161. <para>A classe abstrata Zend_Search_Lucene_Storage_Directory define a
  162. funcionalidade de diretório.</para>
  163. <para>O construtor do Zend_Search_Lucene usa como entrada uma string ou um
  164. objeto da classe Zend_Search_Lucene_Storage_Directory.</para>
  165. <para>A classe Zend_Search_Lucene_Storage_Directory_Filesystem implementa
  166. a funcionalidade de diretório para o sistema de arquivos.</para>
  167. <para>If string is used as an input for the Zend_Search_Lucene
  168. constructor, then the index reader (Zend_Search_Lucene object) treats it
  169. as a file system path and instantiates
  170. Zend_Search_Lucene_Storage_Directory_Filesystem object by
  171. themselves.</para>
  172. <para>Se uma string for usada como entrada para o construtor do
  173. Zend_Search_Lucene, então o leitor do índice (um objeto
  174. Zend_Search_Lucene) a tratará como um caminho para o sistema de arquivos e
  175. instanciará um objeto da classe
  176. Zend_Search_Lucene_Storage_Directory_Filesystem.</para>
  177. <para>Voce pode definir a sua própria implementação de diretório
  178. extendendo a classe Zend_Search_Lucene_Storage_Directory.</para>
  179. <para>Métodos de Zend_Search_Lucene_Storage_Directory: <programlisting>&lt;?php
  180. abstract class Zend_Search_Lucene_Storage_Directory {
  181. /**
  182. * Closes the store.
  183. *
  184. * @return void
  185. */
  186. abstract function close();
  187. /**
  188. * Creates a new, empty file in the directory with the given $filename.
  189. *
  190. * @param string $name
  191. * @return void
  192. */
  193. abstract function createFile($filename);
  194. /**
  195. * Removes an existing $filename in the directory.
  196. *
  197. * @param string $filename
  198. * @return void
  199. */
  200. abstract function deleteFile($filename);
  201. /**
  202. * Returns true if a file with the given $filename exists.
  203. *
  204. * @param string $filename
  205. * @return boolean
  206. */
  207. abstract function fileExists($filename);
  208. /**
  209. * Returns the length of a $filename in the directory.
  210. *
  211. * @param string $filename
  212. * @return integer
  213. */
  214. abstract function fileLength($filename);
  215. /**
  216. * Returns the UNIX timestamp $filename was last modified.
  217. *
  218. * @param string $filename
  219. * @return integer
  220. */
  221. abstract function fileModified($filename);
  222. /**
  223. * Renames an existing file in the directory.
  224. *
  225. * @param string $from
  226. * @param string $to
  227. * @return void
  228. */
  229. abstract function renameFile($from, $to);
  230. /**
  231. * Sets the modified time of $filename to now.
  232. *
  233. * @param string $filename
  234. * @return void
  235. */
  236. abstract function touchFile($filename);
  237. /**
  238. * Returns a Zend_Search_Lucene_Storage_File object for a given $filename in the directory.
  239. *
  240. * @param string $filename
  241. * @return Zend_Search_Lucene_Storage_File
  242. */
  243. abstract function getFileObject($filename);
  244. }
  245. ?&gt;</programlisting></para>
  246. <para>O método <code>getFileObject($filename)</code> da classe
  247. Zend_Search_Lucene_Storage_Directory retorna um objeto
  248. Zend_Search_Lucene_Storage_File.</para>
  249. <para>A classe abstrata Zend_Search_Lucene_Storage_File implementa a
  250. abstração de arquivo e as primitivas de leitura de arquivos de
  251. índice.</para>
  252. <para>Se fizer isso, você também terá que extender a classe
  253. Zend_Search_Lucene_Storage_File para a sua implementação de
  254. diretório.</para>
  255. <para>Somente dois métodos da classe Zend_Search_Lucene_Storage_File devem
  256. ser sobrecarregados em sua implementação: <programlisting>&lt;?php
  257. class MyFile extends Zend_Search_Lucene_Storage_File {
  258. /**
  259. * Sets the file position indicator and advances the file pointer.
  260. * The new position, measured in bytes from the beginning of the file,
  261. * is obtained by adding offset to the position specified by whence,
  262. * whose values are defined as follows:
  263. * SEEK_SET - Set position equal to offset bytes.
  264. * SEEK_CUR - Set position to current location plus offset.
  265. * SEEK_END - Set position to end-of-file plus offset. (To move to
  266. * a position before the end-of-file, you need to pass a negative value
  267. * in offset.)
  268. * Upon success, returns 0; otherwise, returns -1
  269. *
  270. * @param integer $offset
  271. * @param integer $whence
  272. * @return integer
  273. */
  274. public function seek($offset, $whence=SEEK_SET) {
  275. ...
  276. }
  277. /**
  278. * Read a $length bytes from the file and advance the file pointer.
  279. *
  280. * @param integer $length
  281. * @return string
  282. */
  283. protected function _fread($length=1) {
  284. ...
  285. }
  286. }
  287. ?&gt;</programlisting></para>
  288. </sect2>
  289. </sect1>
  290. <!--
  291. vim:se ts=4 sw=4 et:
  292. -->