Zend_Search_Lucene-Queries.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <sect1 id="zend.search.lucene.queries">
  2. <title>Query Types</title>
  3. <sect2 id="zend.search.lucene.queries.term-query">
  4. <title>Term Query</title>
  5. <para>
  6. Term queries zijn bedoeld voor het zoeken met een enkele term.
  7. </para>
  8. <para>
  9. Query string:
  10. </para>
  11. <programlisting role="php"><![CDATA[
  12. $hits = $index->find('word1');]]>
  13. </programlisting>
  14. <para>of</para>
  15. <para>
  16. Query opbouw door API:
  17. </para>
  18. <programlisting role="php"><![CDATA[<?php
  19. $term = new Zend_Search_Lucene_Index_Term('word1');
  20. $query = new Zend_Search_Lucene_Search_Query_Term($term);
  21. $hits = $index->find($query);
  22. ?>]]></programlisting>
  23. </sect2>
  24. <sect2 id="zend.search.lucene.queries.multiterm-query">
  25. <title>Multi-Term Query</title>
  26. <para>
  27. Multi term queries zijn bedoeld voor het zoeken op een set met termen.
  28. </para>
  29. <para>
  30. Elke term in een set kan gedefinieerd worden als noodzakelijk, verboden of geen van beiden (optioneel).
  31. <itemizedlist>
  32. <listitem>
  33. <para>
  34. noodzakelijk betekent dat documenten waar de term niet in voorkomt, niet in het resultaat
  35. terugkomen;
  36. </para>
  37. </listitem>
  38. <listitem>
  39. <para>
  40. verboden betekent dat documenten waar deze term wel in voorkomt niet in het resultaat terugkomen;
  41. </para>
  42. </listitem>
  43. <listitem>
  44. <para>
  45. geen van beiden betekent dat de term niet verboden is voor documenten, maar de term ook niet
  46. noodzakelijk is. Een document moet in dit geval minimaal een term bevatten om in het resultaat
  47. terug te komen.
  48. </para>
  49. </listitem>
  50. </itemizedlist>
  51. </para>
  52. <para>
  53. Dit betekent dat wanneer een optionele term aan een query wordt toegevoerd met noodzakelijke termen,
  54. de documenten in het resultaat hetzelfde blijven, maar documenten waarin de optionele term gevonden word
  55. bovenaan de result set komen te staan.
  56. </para>
  57. <para>
  58. Beide zoekmethodes kunnen worden gebruikt voor multiterm zoekopdrachten.
  59. </para>
  60. <para>
  61. Query string:
  62. </para>
  63. <programlisting role="php"><![CDATA[<?php
  64. $hits = $index->find('+word1 author:word2 -word3');
  65. ?>]]></programlisting>
  66. <para>
  67. <itemizedlist>
  68. <listitem>
  69. <para>
  70. '+' word gebruikt voor een noodzakelijke term.
  71. </para>
  72. </listitem>
  73. <listitem>
  74. <para>
  75. '-' word gebruikt voor een verboden term.
  76. </para>
  77. </listitem>
  78. <listitem>
  79. <para>
  80. 'field:' prefix word gebruikt om een document veld aan te geven bij het zoeken.
  81. Wanneer het niet wordt ingegeven, wordt 'contents' gebruikt.
  82. </para>
  83. </listitem>
  84. </itemizedlist>
  85. </para>
  86. <para>of</para>
  87. <para>
  88. Query opbouw door API:
  89. </para>
  90. <programlisting role="php"><![CDATA[<?php
  91. $query = new Zend_Search_Lucene_Search_Query_MultiTerm();
  92. $query->addTerm(new Zend_Search_Lucene_Index_Term('word1'), true);
  93. $query->addTerm(new Zend_Search_Lucene_Index_Term('word2'), null);
  94. $query->addTerm(new Zend_Search_Lucene_Index_Term('word3'), false);
  95. $hits = $index->find($query);
  96. ?>]]></programlisting>
  97. <para>
  98. <code>$signs</code> array bevat informatie over het type term:
  99. <itemizedlist>
  100. <listitem>
  101. <para>
  102. true word gebruikt om een noodzakelijke term te definieren.
  103. </para>
  104. </listitem>
  105. <listitem>
  106. <para>
  107. false word gebruikt om een verboden term te definieren.
  108. </para>
  109. </listitem>
  110. <listitem>
  111. <para>
  112. null word gebruikt om geen noodzakelijk en geen verboden term te definieren.
  113. </para>
  114. </listitem>
  115. </itemizedlist>
  116. </para>
  117. </sect2>
  118. <sect2 id="zend.search.lucene.queries.phrase-query">
  119. <title>Phrase Query</title>
  120. <para>
  121. Phrase Queries zijn bedoeld voor het zoeken op zinnen (uitdrukkingen?).
  122. </para>
  123. <para>
  124. Phrase Queries zijn erg flexibel en staan toe om te zoeken op zowel exacte als 'slordige' zinnen.
  125. Zinnen kunnen ook gaten of termen bevatten op bepaalde plaatsen. (Dit kan door de Analyser worden
  126. aangemaakt voor verschillende doeleinden. Voorbeeld: Een term kan gedupliceerd worden om een bepaalde
  127. term extra gewicht te geven of verschillende synoniemen kunnen op een plek worden geplaatst).
  128. De volgende phrase queries kunnen alleen door de API worden aangemaakt:
  129. </para>
  130. <programlisting role="php"><![CDATA[<?php
  131. $query1 = new Zend_Search_Lucene_Search_Query_Phrase();
  132. // Voeg 'word1' op relatieve positie 0 toe.
  133. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word1'));
  134. // Voeg 'word2' op relatieve positie 1 toe.
  135. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word2'));
  136. // Voeg 'word3' op relatieve positie 3 toe.
  137. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word3'), 3);
  138. ...
  139. $query2 = new Zend_Search_Lucene_Search_Query_Phrase(
  140. array('word1', 'word2', 'word3'), array(0,1,3));
  141. ...
  142. // Query zonder gat.
  143. $query3 = new Zend_Search_Lucene_Search_Query_Phrase(
  144. array('word1', 'word2', 'word3'));
  145. ...
  146. $query4 = new Zend_Search_Lucene_Search_Query_Phrase(
  147. array('word1', 'word2'), array(0,1), 'annotation');
  148. ?>]]></programlisting>
  149. <para>
  150. Phrase query kunnen worden aangemaakt met een enkele stap in de klasse constructor of stap voor stap met de
  151. <code>Zend_Search_Lucene_Search_Query_Phrase::addTerm()</code> methode.
  152. </para>
  153. <para>
  154. Zend_Search_Lucene_Search_Query_Phrase klasse constructor accepteert drie optionele argumenten:
  155. </para>
  156. <programlisting role="php"><![CDATA[Zend_Search_Lucene_Search_Query_Phrase([array $terms[, array $offsets[, string $field]]]);]]></programlisting>
  157. <para>
  158. <code>$terms</code> is een array van strings, welke een set van zin termen bevat.
  159. Wanneer het niet wordt meegegeven of null is, wordt een lege query aangemaakt.
  160. </para>
  161. <para>
  162. <code>$offsets</code> is een array van integers, welke startpunten van termen in een zin bevatten.
  163. Wanneer het niet wordt meegegeven of null is, wordt uitgegaan van posities zoals <code>array(0, 1, 2, 3, ...)</code>.
  164. </para>
  165. <para>
  166. <code>$field</code> is een string, welke aangeeft welk document veld doorzocht moet worden.
  167. Wanneer het niet wordt meegegeven of null is, dan wordt het standaard veld doorzicht.
  168. Deze versie van Zend_Search_Lucene behandelt het 'contents' veld als standaard, maar het plan is dit aan
  169. te passen tot "ieder veld" in volgende versies.
  170. </para>
  171. <para>
  172. Dus:
  173. </para>
  174. <programlisting role="php"><![CDATA[$query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'));]]></programlisting>
  175. <para>
  176. zoekt naar de 'zend framework' uitdrukking.
  177. </para>
  178. <programlisting role="php"><![CDATA[<$query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'download'), array(0, 2));]]></programlisting>
  179. <para>
  180. zoekt naar 'zend ????? download' en dus voldoet 'zend platform download', 'zend studio download',
  181. 'zend core download', 'zend framework download' hieraan.
  182. </para>
  183. <programlisting role="php"><![CDATA[$query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'), null, 'title');]]></programlisting>
  184. <para>
  185. zoekt naar 'zend framework' in het 'title' veld.
  186. </para>
  187. <para>
  188. <code>Zend_Search_Lucene_Search_Query_Phrase::addTerm()</code> methode accepteert twee argumenten.
  189. Noodzakelijk <code>Zend_Search_Lucene_Index_Term</code> object en optioneel positie:
  190. </para>
  191. <programlisting role="php"><![CDATA[Zend_Search_Lucene_Search_Query_Phrase::addTerm(Zend_Search_Lucene_Index_Term $term[, integer $position]);]]></programlisting>
  192. <para>
  193. <code>$term</code> omschrijft de volgende term binnen de uitdrukking. Het moet hetzelfde veld als eerdere
  194. termen omschrijven.
  195. Anders wordt er een exceptie opgeworpen.
  196. </para>
  197. <para>
  198. <code>$position</code> geeft de positie van de term aan.
  199. </para>
  200. <para>
  201. Dus:
  202. </para>
  203. <programlisting role="php"><![CDATA[$query = new Zend_Search_Lucene_Search_Query_Phrase();
  204. $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'));
  205. $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'));]]></programlisting>
  206. <para>
  207. zoekt naar de 'zend framework' uitdrukking.
  208. </para>
  209. <programlisting role="php"><![CDATA[$query = new Zend_Search_Lucene_Search_Query_Phrase();
  210. $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'), 0);
  211. $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'), 2);]]></programlisting>
  212. <para>
  213. zoekt naar de 'zend ????? download' uitdrukking en dus zal 'zend platform download', 'zend studio download',
  214. 'zend core download', 'zend framework download' hieraan voldoen.
  215. </para>
  216. <programlisting role="php"><![CDATA[$query = new Zend_Search_Lucene_Search_Query_Phrase();
  217. $query->addTerm(new Zend_Search_Lucene_Index_Term('zend', 'title'));
  218. $query->addTerm(new Zend_Search_Lucene_Index_Term('framework', 'title'));]]></programlisting>
  219. <para>
  220. zoekt naar 'zend framework' in het 'title' veld.
  221. </para>
  222. <para>
  223. Slop factor zet het aantal woorden dat is toegestaan binnen een query uitdrukking. Wanneer deze nul is,
  224. wordt er op een exacte uitdrukking gezocht. Voor hogere waardes werkt het als een WITHIN of NEAR operator.
  225. </para>
  226. <para>
  227. De 'slop' is eigenlijk een editie-afstand, waar de eenheden overeenkomen met wijzigingen in de
  228. positie van termen in de query uitdrukking. Voorbeeld: om de volgorde van twee woorden aan te passen is
  229. twee wijzigingen (de eerste wijzigingen zet beide termen op dezelfde positie), om het herschikken
  230. van uitdrukkingen toe te staan dient 'slop' minstens twee te zijn.
  231. </para>
  232. <para>
  233. Exactere overeenkomsten krijgen een hogere score dan slordigere overeenkomsten, dus zoekresultaten worden
  234. geordend op exactheid. 'Slop' staat standaard op nul, waardoor exacte overeenkomsten noodzakelijk zijn.
  235. </para>
  236. <para>
  237. Slop factor kan na het aanmaken van een query worden aangegeven:
  238. </para>
  239. <programlisting role="php"><![CDATA[<?php
  240. // Query zonder een gat.
  241. $query = new Zend_Search_Lucene_Search_Query_Phrase(array('word1', 'word2'));
  242. // Zoek naar 'word1 word2', 'word1 ... word2'
  243. $query->setSlop(1);
  244. $hits1 = $index->find($query);
  245. // Zoek naar 'word1 word2', 'word1 ... word2',
  246. // 'word1 ... ... word2', 'word2 word1'
  247. $query->setSlop(2);
  248. $hits2 = $index->find($query);
  249. ?>]]></programlisting>
  250. </sect2>
  251. </sect1>