Zend_Search_Lucene-Searching.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <sect1 id="zend.search.lucene.searching">
  2. <title>搜索索引</title>
  3. <sect2 id="zend.search.lucene.searching.query-parser">
  4. <title>建立查询</title>
  5. <para>
  6. 有两种方式可以在索引中进行搜索。第一个方式是使用查询分析程序(Query Parser)来从字符串中创建查询。第二个方式通过 Zend_Search_Lucene API 提供了创建自己的查询的可能。
  7. </para>
  8. <para>
  9. 在选择使用查询分析程序之前,请考虑下面问题:
  10. <orderedlist>
  11. <listitem>
  12. <para>
  13. 如果你使用程序生成查询字串并传递给查询分析程序,那么你最好考虑直接使用查询 API 来建立查询。换句话说,查询分析程序是为人为输入的文本设计的,而不是为程序生成的文本准备的。
  14. </para>
  15. </listitem>
  16. <listitem>
  17. <para>
  18. 非记号化字段最好直接加入查询中,而不是通过查询分析程序。如果一个字段的值是应用程序生成的,那么它应该按照这个条款进行查询。查询分析程序使用的机制,是设计来转换人为输入的文本的。像日期、关键词等等,都可以认为是程序生成的信息。
  19. </para>
  20. </listitem>
  21. <listitem>
  22. <para>
  23. 在查询表单中,用于产生文本的字段应该是用查询分析程序。所有其它的诸如日期范围、关键词等,最好通过查询 API 直接加入查询中。一个具有一组取之范围的字段,可以通过下拉菜单来实现而不应该加入需要被分析的查询字串中,而不是增加一个查询项。
  24. </para>
  25. </listitem>
  26. </orderedlist>
  27. </para>
  28. <para>
  29. 两种途径都使用同样的 API 方法来搜索索引:
  30. <programlisting role="php"><![CDATA[<?php
  31. require_once('Zend/Search/Lucene.php');
  32. $index = new Zend_Search_Lucene('/data/my_index');
  33. $index->find($query);
  34. ?>]]></programlisting>
  35. 方法 <code>Zend_Search_Lucene::find()</code> 自动检查输入类型并使用查询分析程序从字符串建立适当的 Zend_Search_Lucene_Search_Query 对象。
  36. </para>
  37. <para>
  38. 需要特别注意的是 <code>find()</code> 是大小写敏感的。默认的,LuceneIndexCreation.jar
  39. 标准化所有文档为小写。可以通过命令行来关闭这个设置(输入不带参数的 LuceneIndexCreation.jar
  40. 命令来获取帮助)。提供给 <code>find()</code> 的文本大小写必须和索引中的相匹配。如果索引被正常设置为全小写,那么提供给
  41. <code>find()</code> 的文本必须用 <code>strtolower()</code>处理,否则它可能无法被匹配。
  42. </para>
  43. </sect2>
  44. <sect2 id="zend.search.lucene.searching.results">
  45. <title>搜索结果</title>
  46. <para>
  47. 搜索结果是一个 Zend_Search_Lucene_Search_QueryHit 对象数组。每一个数组元素具有两个属性:
  48. <code>$hit->document</code> 是索引中的文档编号,<code>$hit->score</code> 是其在搜索结果中的分值。搜索结果是按照分值排序的(最高分的搜索结果位于最前面)。
  49. </para>
  50. <para>
  51. Zend_Search_Lucene_Search_QueryHit 对象还能将 Zend_Search_Lucene_Document 中的各个字段作为属性陈列出来。在下面这个例子中,搜索结果相应的文档具有两个字段:title 和 author。
  52. <programlisting role="php"><![CDATA[<?php
  53. require_once('Zend/Search/Lucene.php');
  54. $index = new Zend_Search_Lucene('/data/my_index');
  55. $hits = $index->find($query);
  56. foreach ($hits as $hit) {
  57. echo $hit->id;
  58. echo $hit->score;
  59. echo $hit->title;
  60. echo $hit->author;
  61. }
  62. ?>]]></programlisting>
  63. </para>
  64. <para>
  65. 可选的,原始的 Zend_Search_Lucene_Document 对象可以从 Zend_Search_Lucene_Search_QueryHit 获得。你可以使用索引对象的 <code>getDocument()</code>
  66. 方法来获取文档进行了索引的部分并接着使用
  67. <code>getFieldValue()</code> 方法。
  68. <programlisting role="php"><![CDATA[<?php
  69. require_once('Zend/Search/Lucene.php');
  70. $index = new Zend_Search_Lucene('/data/my_index');
  71. $hits = $index->find($query);
  72. foreach ($hits as $hit) {
  73. // return Zend_Search_Lucene_Document object for this hit
  74. echo $document = $hit->getDocument();
  75. // return a Zend_Search_Lucene_Field object
  76. // from the Zend_Search_Lucene_Document
  77. echo $document->getField('title');
  78. // return the string value of the Zend_Search_Lucene_Field object
  79. echo $document->getFieldValue('title');
  80. // same as getFieldValue()
  81. echo $document->title;
  82. }
  83. ?>]]></programlisting>
  84. 能够获取的 Zend_Search_Lucene_Document 对象的字段是在进行索引的时候决定的。由索引创建程序(例如:LuceneIndexCreation.jar)在文档中建立的文档字段要么是被索引的,要么是被索引并保存的。
  85. </para>
  86. <para>
  87. 请注意,文档标识(在本例中是'path')也保存在索引中,它必须被提取出来。
  88. </para>
  89. </sect2>
  90. <sect2 id="zend.search.lucene.searching.results-scoring">
  91. <title>结果评分</title>
  92. <para>
  93. Zend_Search_Lucene 使用和 Java Lucene 一样的评分算法。搜索结果是按照分值进行排序的。分值越大,相应的搜索结果点击排在排位越靠前。
  94. </para>
  95. <para>
  96. 不同的分值意味着一篇文档相比另一篇更能匹配查询要求。
  97. </para>
  98. <para>
  99. 粗略的说,包含更多的搜索项或短语的搜索结果,将会具有更高的分值。
  100. </para>
  101. <para>
  102. 可以通过 score 属性获取一个搜索结果的分值:
  103. <programlisting role="php"><![CDATA[<?php
  104. $hits = $index->find($query);
  105. foreach ($hits as $hit) {
  106. echo $hit->id;
  107. echo $hit->score;
  108. }
  109. ?>]]></programlisting>
  110. </para>
  111. <para>
  112. 类 Zend_Search_Lucene_Search_Similarity 用于计算分值。请参阅<link linkend="zend.search.lucene.extending.scoring">“扩展性”中“评分算法”</link>一节了解详情。
  113. </para>
  114. </sect2>
  115. </sect1>
  116. <!--
  117. vim:se ts=4 sw=4 et:
  118. -->