Zend_Search_Lucene-Queries.xml 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.query-api">
  5. <title>Abfrage Erzeugungs API</title>
  6. <para>
  7. Zusätzlich zum automatischen Analysieren vom Abfragen ist es auch möglich diese durch eine
  8. <acronym>API</acronym> zu erzeugen.
  9. </para>
  10. <para>
  11. Benutzerabfragen können mit Abfragen die durch die <acronym>API</acronym> erstellte wurden
  12. kombiniert werden. Einfach den Abfrageparser verwenden um eine Abfrage von einem String zu
  13. erstellen:
  14. </para>
  15. <programlisting language="php"><![CDATA[
  16. $query = Zend_Search_Lucene_Search_QueryParser::parse($queryString);
  17. ]]></programlisting>
  18. <sect2 id="zend.search.lucene.queries.exceptions">
  19. <title>Abfrageparser Ausnahmen</title>
  20. <para>
  21. Der Abfrageparser kann zwei Typen von Ausnahmen erstellen.
  22. <itemizedlist>
  23. <listitem>
  24. <para>
  25. <classname>Zend_Search_Lucene_Exception</classname> wird geworfen wenn
  26. irgendwas im Abfrageparser selbst falsch läuft.
  27. </para>
  28. </listitem>
  29. <listitem>
  30. <para>
  31. <classname>Zend_Search_Lucene_Search_QueryParserException</classname> wird
  32. geworfen wenn ein Fehler im Syntax der Abfrage ist.
  33. </para>
  34. </listitem>
  35. </itemizedlist>
  36. Es ist eine gute Idee die
  37. <classname>Zend_Search_Lucene_Search_QueryParserException</classname>s abzufangen und
  38. richtig abzuarbeiten:
  39. </para>
  40. <programlisting language="php"><![CDATA[
  41. try {
  42. $query = Zend_Search_Lucene_Search_QueryParser::parse($queryString);
  43. } catch (Zend_Search_Lucene_Search_QueryParserException $e) {
  44. echo "Abfrage Syntax Fehler: " . $e->getMessage() . "\n";
  45. }
  46. ]]></programlisting>
  47. <para>
  48. Die selbe Technik sollte für die find() Methode des
  49. <classname>Zend_Search_Lucene</classname> Objektes verwendet werden.
  50. </para>
  51. <para>
  52. Beginnend mit 1.5 werden Abfrageparser Exceptions standardmäßig unterdrückt. Wenn eine
  53. Abfrage nicht konform mit der Abfragesprache ist, dann wird Sie mithilfe des aktuellen
  54. Standardanalysators gestückelt und alle Begriffsstücke werden für die Suche verwendet.
  55. Die
  56. <methodname>Zend_Search_Lucene_Search_QueryParser::dontSuppressQueryParsingExceptions()</methodname>
  57. Methode kann verwendet werden um Exceptions einzuschalten. Die
  58. <methodname>Zend_Search_Lucene_Search_QueryParser::suppressQueryParsingExceptions()</methodname>
  59. und
  60. <methodname>Zend_Search_Lucene_Search_QueryParser::queryParsingExceptionsSuppressed()</methodname>
  61. Methoden sind auch dazu gedacht das Verhalten der Exceptionsbehandlung zu verwalten.
  62. </para>
  63. </sect2>
  64. <sect2 id="zend.search.lucene.queries.term-query">
  65. <title>Begriffsabfrage</title>
  66. <para>
  67. Begriffsabfragen können für das Suchen mit einem einzelnen Begriff verwendet werden.
  68. </para>
  69. <para>
  70. Abfragestring:
  71. </para>
  72. <programlisting language="querystring"><![CDATA[
  73. word1
  74. ]]></programlisting>
  75. <para>oder</para>
  76. <para>
  77. Aufbau der Abfrage mit der <acronym>API</acronym>:
  78. </para>
  79. <programlisting language="php"><![CDATA[
  80. $term = new Zend_Search_Lucene_Index_Term('word1', 'field1');
  81. $query = new Zend_Search_Lucene_Search_Query_Term($term);
  82. $hits = $index->find($query);
  83. ]]></programlisting>
  84. <para>
  85. Das Term Feld ist optional. <classname>Zend_Search_Lucene</classname> durchsucht alle
  86. indizierten Felder in jedem Dokument wenn das Feld nicht spezifiziert wurde:
  87. </para>
  88. <programlisting language="php"><![CDATA[
  89. // Sucht nach 'word1' in allen indizierten Feldern
  90. $term = new Zend_Search_Lucene_Index_Term('wort1');
  91. $query = new Zend_Search_Lucene_Search_Query_Term($term);
  92. $hits = $index->find($query);
  93. ]]></programlisting>
  94. </sect2>
  95. <sect2 id="zend.search.lucene.queries.multiterm-query">
  96. <title>Mehrfache Begriffsabfrage</title>
  97. <para>
  98. Mehrfache Begriffsabfragen sind für Suchen mit einem Satz von Begriffen gedacht.
  99. </para>
  100. <para>
  101. Jeder Begriff dieses Satzes kann als <emphasis>required</emphasis> (notwendig),
  102. <emphasis>prohibited</emphasis> (verboten) oder <emphasis>neither</emphasis> (weder
  103. noch) definiert werden.
  104. <itemizedlist>
  105. <listitem>
  106. <para>
  107. <emphasis>required</emphasis> bedeutet, dass Dokumente, die diesen
  108. Begriff nicht enthalten, nicht der Abfrage entsprechen;
  109. </para>
  110. </listitem>
  111. <listitem>
  112. <para>
  113. <emphasis>prohibited</emphasis> bedeutet, dass Dokumente, die diesen
  114. Begriff enthalten, nicht der Abfrage entsprechen;
  115. </para>
  116. </listitem>
  117. <listitem>
  118. <para>
  119. <emphasis>neither</emphasis>, in welchem Fall Dokumenten den Begriff weder
  120. nicht enthalten dürfen, noch den Begriff enthalten müssen. Nichtsdestrotrotz
  121. muß ein Dokument mindestens einem Begriff entsprechen, um der Abfrage
  122. zu entsprechen.
  123. </para>
  124. </listitem>
  125. </itemizedlist>
  126. </para>
  127. <para>
  128. Wenn einer Abfrage mit notwendigen Begriffen optionale Betriffe hinzugefügt werden,
  129. werden beide Abfragen das gleiche Set an Ergebnissen haben, aber der optionale Begriff
  130. kann die Bewertung der passenden Dokumente beeinflussen.
  131. </para>
  132. <para>
  133. Beide Suchmethoden können für Mehrfache Begriffsabfragen verwendet werden.
  134. </para>
  135. <para>
  136. Abfragestring:
  137. </para>
  138. <programlisting language="querystring"><![CDATA[
  139. +word1 author:word2 -word3
  140. ]]></programlisting>
  141. <itemizedlist>
  142. <listitem><para>'+' wird für notwendige Begriffe verwendet.</para></listitem>
  143. <listitem><para>'-' wird für verbotene Begriffe verwendet.</para></listitem>
  144. <listitem>
  145. <para>
  146. Der 'field:' Präfix wird für die Angabe des Dokumentenfelds für die Suche
  147. verwendet. Wenn er weggelassen wird, werden alle Felder durchsucht.
  148. </para>
  149. </listitem>
  150. </itemizedlist>
  151. <para>oder</para>
  152. <para>
  153. Aufbau der Abfrage mit der <acronym>API</acronym>:
  154. </para>
  155. <programlisting language="php"><![CDATA[
  156. $query = new Zend_Search_Lucene_Search_Query_MultiTerm();
  157. $query->addTerm(new Zend_Search_Lucene_Index_Term('word1'), true);
  158. $query->addTerm(new Zend_Search_Lucene_Index_Term('word2', 'author'),
  159. null);
  160. $query->addTerm(new Zend_Search_Lucene_Index_Term('word3'), false);
  161. $hits = $index->find($query);
  162. ]]></programlisting>
  163. <para>
  164. Es ist auch möglich Begriffslisten in einem MultiTerm Anfrage Konstruktor zu
  165. spezifizieren:
  166. </para>
  167. <programlisting language="php"><![CDATA[
  168. $terms = array(new Zend_Search_Lucene_Index_Term('word1'),
  169. new Zend_Search_Lucene_Index_Term('word2', 'author'),
  170. new Zend_Search_Lucene_Index_Term('word3'));
  171. $signs = array(true, null, false);
  172. $query = new Zend_Search_Lucene_Search_Query_MultiTerm($terms, $signs);
  173. $hits = $index->find($query);
  174. ]]></programlisting>
  175. <para>
  176. Das <varname>$signs</varname> Array enthält Informationen über den Begriffstyp:
  177. <itemizedlist>
  178. <listitem>
  179. <para>
  180. <constant>TRUE</constant> wird für notwendige Begriffe verwendet.
  181. </para>
  182. </listitem>
  183. <listitem>
  184. <para>
  185. <constant>FALSE</constant> wird für verbotene Begriffe verwendet.
  186. </para>
  187. </listitem>
  188. <listitem>
  189. <para>
  190. <constant>NULL</constant> wird für weder notwendige noch verbotene Begriffe
  191. verwendet.
  192. </para>
  193. </listitem>
  194. </itemizedlist>
  195. </para>
  196. </sect2>
  197. <sect2 id="zend.search.lucene.queries.boolean-query">
  198. <title>Boolsche Abfragen</title>
  199. <para>
  200. Boolsche Abfragen erlauben die Erstellung von Abfragen die andere Abfragen und boolsche
  201. Operatoren verwenden.
  202. </para>
  203. <para>
  204. Jede Subabfrage in einem Set kann als <emphasis>required</emphasis>,
  205. <emphasis>prohibited</emphasis>, oder <emphasis>optional</emphasis> definiert werden.
  206. <itemizedlist>
  207. <listitem>
  208. <para>
  209. <emphasis>required</emphasis> bedeutet das Dokumente die dieser Unterabfrage
  210. nicht entsprechen auch der Gesamtabfrage nicht entsprechen;
  211. </para>
  212. </listitem>
  213. <listitem>
  214. <para>
  215. <emphasis>prohibited</emphasis> bedeutet das Dokumente die dieser
  216. Unterabfrage entsprechen auch der Gesamtabfrage nicht entsprechen;
  217. </para>
  218. </listitem>
  219. <listitem>
  220. <para>
  221. <emphasis>optional</emphasis>, in dem Fall das entsprechende Dokumente in
  222. der Unterabfrage weder verboten noch benötigt werden. Ein Dokument muß
  223. trotzdem zumindest in 1 Unterabfrage entsprechen damit es der in der
  224. Gesamtabfrage entspricht.
  225. </para>
  226. </listitem>
  227. </itemizedlist>
  228. </para>
  229. <para>
  230. Wenn optionale Unterabfragen einer Abfrage mit benötigen Unterabfragen hinzugefügt
  231. werden, werden beide Abfragen das gleiche Ergebnisset haben, aber die optionale
  232. Unterabfrage kann die Wertung der passenden Dokumente beeinflussen.
  233. </para>
  234. <para>
  235. Beide Suchmethoden können für boolsche Abfragen verwendet werden.
  236. </para>
  237. <para>
  238. Abfrage String:
  239. </para>
  240. <programlisting language="querystring"><![CDATA[
  241. +(word1 word2 word3) (author:word4 author:word5) -(word6)
  242. ]]></programlisting>
  243. <itemizedlist>
  244. <listitem>
  245. <para>
  246. '+' wird verwendet um eine benötigte Unterabfrage zu definieren.
  247. </para>
  248. </listitem>
  249. <listitem>
  250. <para>
  251. '-' wird verwendet um eine verbotene Unterabfrage zu definieren.
  252. </para>
  253. </listitem>
  254. <listitem>
  255. <para>
  256. 'field:' Der Prefix wird verwendet um ein Feld des Dokuments für eine Suche zu
  257. markieren. Wenn es nicht angegeben wird, werden alle Felder durchsucht.
  258. </para>
  259. </listitem>
  260. </itemizedlist>
  261. <para>oder</para>
  262. <para>
  263. Aufbau der Abfrage durch die <acronym>API</acronym>:
  264. </para>
  265. <programlisting language="php"><![CDATA[
  266. $query = new Zend_Search_Lucene_Search_Query_Boolean();
  267. $subquery1 = new Zend_Search_Lucene_Search_Query_MultiTerm();
  268. $subquery1->addTerm(new Zend_Search_Lucene_Index_Term('word1'));
  269. $subquery1->addTerm(new Zend_Search_Lucene_Index_Term('word2'));
  270. $subquery1->addTerm(new Zend_Search_Lucene_Index_Term('word3'));
  271. $subquery2 = new Zend_Search_Lucene_Search_Query_MultiTerm();
  272. $subquery2->addTerm(new Zend_Search_Lucene_Index_Term('word4', 'author'));
  273. $subquery2->addTerm(new Zend_Search_Lucene_Index_Term('word5', 'author'));
  274. $term6 = new Zend_Search_Lucene_Index_Term('word6');
  275. $subquery3 = new Zend_Search_Lucene_Search_Query_Term($term6);
  276. $query->addSubquery($subquery1, true /* benötigt (required) */);
  277. $query->addSubquery($subquery2, null /* optional */);
  278. $query->addSubquery($subquery3, false /* verboten (prohibited) */);
  279. $hits = $index->find($query);
  280. ]]></programlisting>
  281. <para>
  282. Es ist auch möglich Listen von Unterabfragen im Konstruktor der Boolschen Abfrage zu
  283. definieren:
  284. </para>
  285. <programlisting language="php"><![CDATA[
  286. ...
  287. $subqueries = array($subquery1, $subquery2, $subquery3);
  288. $signs = array(true, null, false);
  289. $query = new Zend_Search_Lucene_Search_Query_Boolean($subqueries, $signs);
  290. $hits = $index->find($query);
  291. ]]></programlisting>
  292. <para>
  293. Das <varname>$signs</varname> Array enthält Informationen über den Typ der Unterabfrage:
  294. <itemizedlist>
  295. <listitem>
  296. <para>
  297. <constant>TRUE</constant> wird verwendet um eine benötigte Unterabfrage zu
  298. definieren.
  299. </para>
  300. </listitem>
  301. <listitem>
  302. <para>
  303. <constant>FALSE</constant> wird verwendet um eine verbotene Unterabfrage zu
  304. definieren.
  305. </para>
  306. </listitem>
  307. <listitem>
  308. <para>
  309. <constant>NULL</constant> wird verwendet um eine Unterabfrage zu definieren
  310. die weder benötigt noch verboten ist.
  311. </para>
  312. </listitem>
  313. </itemizedlist>
  314. </para>
  315. <para>
  316. Jede Abfrage die boolsche Operatoren verwendet kann, kann auch auch umgeschrieben werden
  317. damit Sie die Vorzeichen-Schreibweise verwendet und mit Hilfe der <acronym>API</acronym>
  318. erstellt wird. Zum Beispiel:
  319. </para>
  320. <programlisting language="querystring"><![CDATA[
  321. word1 AND (word2 AND word3 AND NOT word4) OR word5
  322. ]]></programlisting>
  323. <para>
  324. ist identisch mit
  325. </para>
  326. <programlisting language="querystring"><![CDATA[
  327. (+(word1) +(+word2 +word3 -word4)) (word5)
  328. ]]></programlisting>
  329. </sect2>
  330. <sect2 id="zend.search.lucene.queries.wildcard">
  331. <title>Wildcard Abfragen</title>
  332. <para>
  333. Wildcard Abfragen können dazu verwendet werden um nach Dokumenten zu suchen die Strings
  334. enthalten welche den spezifizierten Patterns entsprechen.
  335. </para>
  336. <para>
  337. Das '?' Symbol wird als Wildcard für ein einzelnes Zeichen verwendet.
  338. </para>
  339. <para>
  340. Das '*' Symbol wird als Woldcard für mehrere Zeichen verwendet.
  341. </para>
  342. <para>
  343. Abfragestring:
  344. </para>
  345. <programlisting language="querystring"><![CDATA[
  346. field1:test*
  347. ]]></programlisting>
  348. <para>oder</para>
  349. <para>
  350. Abfrageerstellung durch die <acronym>API</acronym>:
  351. </para>
  352. <programlisting language="php"><![CDATA[
  353. $pattern = new Zend_Search_Lucene_Index_Term('test*', 'field1');
  354. $query = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
  355. $hits = $index->find($query);
  356. ]]></programlisting>
  357. <para>
  358. Die Ausdrucksfelder sind optional. <classname>Zend_Search_Lucene</classname> durchsucht
  359. alle Felder in jedem Dokument wenn kein Feld spezifiziert wurde:
  360. </para>
  361. <programlisting language="php"><![CDATA[
  362. $pattern = new Zend_Search_Lucene_Index_Term('test*');
  363. $query = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
  364. $hits = $index->find($query);
  365. ]]></programlisting>
  366. </sect2>
  367. <sect2 id="zend.search.lucene.queries.fuzzy">
  368. <title>Fuzzy Abfragen</title>
  369. <para>
  370. Fuzzy Abfragen können verwendet werden um nach Dokumenten zu Suchen die Strings
  371. enthalten welche Ausdrücken entsprechen die den spezifizierten Ausdrücken ähnlich sind.
  372. </para>
  373. <para>
  374. Abfrage String:
  375. </para>
  376. <programlisting language="querystring"><![CDATA[
  377. field1:test~
  378. ]]></programlisting>
  379. <para>
  380. Diese Abfrage trifft Dokumente welche die Wörter 'test' 'text' 'best' und andere
  381. enthalten.
  382. </para>
  383. <para>oder</para>
  384. <para>
  385. Abfrageerstellung durch die <acronym>API</acronym>:
  386. </para>
  387. <programlisting language="php"><![CDATA[
  388. $term = new Zend_Search_Lucene_Index_Term('test', 'field1');
  389. $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term);
  390. $hits = $index->find($query);
  391. ]]></programlisting>
  392. <para>
  393. Optional kann die Ähnlichkeit nach dem "~" Zeichen spezifiziert werden.
  394. </para>
  395. <para>
  396. Abfrage String:
  397. </para>
  398. <programlisting language="querystring"><![CDATA[
  399. field1:test~0.4
  400. ]]></programlisting>
  401. <para>oder</para>
  402. <para>
  403. Abfrageerstellung durch die <acronym>API</acronym>:
  404. </para>
  405. <programlisting language="php"><![CDATA[
  406. $term = new Zend_Search_Lucene_Index_Term('test', 'field1');
  407. $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, 0.4);
  408. $hits = $index->find($query);
  409. ]]></programlisting>
  410. <para>
  411. Das Term Feld ist optional. <classname>Zend_Search_Lucene</classname> durchsucht alle
  412. Felder in jedem Dokument ob ein Feld nicht spezifiziert ist:
  413. </para>
  414. <programlisting language="php"><![CDATA[
  415. $term = new Zend_Search_Lucene_Index_Term('test');
  416. $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term);
  417. $hits = $index->find($query);
  418. ]]></programlisting>
  419. </sect2>
  420. <sect2 id="zend.search.lucene.queries.phrase-query">
  421. <title>Phrasenabfrage</title>
  422. <para>
  423. Phrasenabfragen können für das Suchen einer Phrase innerhalb von Dokumenten verwendet
  424. werden.
  425. </para>
  426. <para>
  427. Phrasenabfragen sind sehr flexibel und erlauben dem Benutzer oder Entwickler nach
  428. exakten Phrasen zu suchen wie auch nach 'ungenauen' Phrasen.
  429. </para>
  430. <para>
  431. Phrasen können auch Lücken oder mehrere Begriffe an der selben Stelle enthalten; diese
  432. können mit Hilfe das Analysators für verschiedene Zwecke generiert werden, z.B. kann ein
  433. Begriff verdoppelt werden, um das Gewicht des Begriffs zu erhöhen oder verschiedene
  434. Synonyme können an einer Stelle platziert werden.
  435. </para>
  436. <programlisting language="php"><![CDATA[
  437. $query1 = new Zend_Search_Lucene_Search_Query_Phrase();
  438. // Füge 'word1' an der relativen Position 0 hinzu.
  439. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word1'));
  440. // Füge 'word2' an der relativen Position 1 hinzu.
  441. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word2'));
  442. // Füge 'word3' an der relativen Position 3 hinzu.
  443. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word3'), 3);
  444. ...
  445. $query2 = new Zend_Search_Lucene_Search_Query_Phrase(
  446. array('word1', 'word2', 'word3'), array(0,1,3));
  447. ...
  448. // Abfrage ohne eine Lücke.
  449. $query3 = new Zend_Search_Lucene_Search_Query_Phrase(
  450. array('word1', 'word2', 'word3'));
  451. ...
  452. $query4 = new Zend_Search_Lucene_Search_Query_Phrase(
  453. array('word1', 'word2'), array(0,1), 'annotation');
  454. ]]></programlisting>
  455. <para>
  456. Eine Phrasenabfrage kann in einem Schritt mit einem Klassenkonstruktor erstellt werden
  457. oder Schritt für Schritt mit der
  458. <methodname>Zend_Search_Lucene_Search_Query_Phrase::addTerm()</methodname> Methode.
  459. </para>
  460. <para>
  461. Der <classname>Zend_Search_Lucene_Search_Query_Phrase</classname> Klassenkonstruktor
  462. nimmt drei optionale Argumente entgegen:
  463. </para>
  464. <programlisting language="php"><![CDATA[
  465. Zend_Search_Lucene_Search_Query_Phrase(
  466. [array $terms[, array $offsets[, string $field]]]
  467. );
  468. ]]></programlisting>
  469. <para>
  470. Der <varname>$terms</varname> Parameter ist ein Array von Strings die ein Set von
  471. Phrasen Strings enthalten. Wenn er ausgelassen wird oder <constant>NULL</constant> ist,
  472. wird eine leere Abfrage erstellt.
  473. </para>
  474. <para>
  475. Der <varname>$offsets</varname> Parameter ist von ganzen Zahlen, welche den Offset von
  476. Begriffen in einer Phrase enthalten. Wenn er ausgelassen wird oder
  477. <constant>TRUE</constant> ist, werden die Positionen der Begriffe als sequentiell, ohne
  478. Zwischenräume, angenommen.
  479. </para>
  480. <para>
  481. Der <varname>$field</varname> Parameter ist ein String, der das zu durchsuchende
  482. Dokumentenfeld angibt. Wenn dies ausgelassen wird oder <constant>TRUE</constant>
  483. entspricht, wird das Standardfeld durchsucht.
  484. </para>
  485. <programlisting language="php"><![CDATA[
  486. $query =
  487. new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'));
  488. ]]></programlisting>
  489. <para>
  490. Wird nach der Phrase 'zend framework' in allen Feldern suchen.
  491. </para>
  492. <programlisting language="php"><![CDATA[
  493. $query = new Zend_Search_Lucene_Search_Query_Phrase(
  494. array('zend', 'download'), array(0, 2)
  495. );
  496. ]]></programlisting>
  497. <para>
  498. Es wird nach der Phrase 'zend ????? download' gesucht und die Phrasen 'zend platform
  499. download', 'zend studio download', 'zend core download', 'zend framework download' und
  500. so weiter werden gefunden.
  501. </para>
  502. <programlisting language="php"><![CDATA[
  503. $query = new Zend_Search_Lucene_Search_Query_Phrase(
  504. array('zend', 'framework'), null, 'title'
  505. );
  506. ]]></programlisting>
  507. <para>
  508. Wird nach der Phrase 'zend framework' im 'title' Feld suchen.
  509. </para>
  510. <para>
  511. Die <methodname>Zend_Search_Lucene_Search_Query_Phrase::addTerm()</methodname> Methode
  512. nimmt zwei Argumente entgeben. Ein <classname>Zend_Search_Lucene_Index_Term</classname>
  513. Objekt ist erforderlich und die Position optional:
  514. </para>
  515. <programlisting language="php"><![CDATA[
  516. Zend_Search_Lucene_Search_Query_Phrase::addTerm(
  517. Zend_Search_Lucene_Index_Term $term[, integer $position]
  518. );
  519. ]]></programlisting>
  520. <para>
  521. <varname>$term</varname> enthält den nächsten Begriff in der Phrase. Er muss das selbe
  522. Feld ansprechen wie der vorherige Begriff. Andernfalls wird eine Ausnahme geworfen.
  523. </para>
  524. <para>
  525. <varname>$position</varname> gibt die Position des Begriffes an.
  526. </para>
  527. <programlisting language="php"><![CDATA[
  528. $query = new Zend_Search_Lucene_Search_Query_Phrase();
  529. $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'));
  530. $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'));
  531. ]]></programlisting>
  532. <para>
  533. Demnach wird hier nach der Phrase 'zend framework' gesucht.
  534. </para>
  535. <programlisting language="php"><![CDATA[
  536. $query = new Zend_Search_Lucene_Search_Query_Phrase();
  537. $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'), 0);
  538. $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'), 2);
  539. ]]></programlisting>
  540. <para>
  541. Es wird nach der Phrase 'zend ????? download' gesucht und die Phrasen 'zend platform
  542. download', 'zend studio download', 'zend core download', 'zend framework download' und
  543. so weiter werden gefunden.
  544. </para>
  545. <programlisting language="php"><![CDATA[
  546. $query = new Zend_Search_Lucene_Search_Query_Phrase();
  547. $query->addTerm(new Zend_Search_Lucene_Index_Term('zend', 'title'));
  548. $query->addTerm(new Zend_Search_Lucene_Index_Term('framework', 'title'));
  549. ]]></programlisting>
  550. <para>
  551. Es wird nach der Phrase 'zend framework' im 'title' Feld gesucht.
  552. </para>
  553. <para>
  554. Der Ungenauigkeitsfaktor (slop factor) legt die Anzahl der anderen Wörter fest die
  555. zwischen den spezifizierten Phrasenabfragen erlaubt sind. Wenn der Wert 0 ist, ist die
  556. entsprechende Abfrage eine exakte Suche nach der Phrase. Für größere Werte funktioniert
  557. das ähnlich dem WITHIN (innerhalb) oder NEAR (nahe) Operator.
  558. </para>
  559. <para>
  560. Der Ungenauigkeitsfaktor ist tatsächlich eine veränderbare Distanz, wobei die
  561. Veränderung dem Verschieben von Begriffen in der Phrasenabfrage entspricht. Um zum
  562. Beispiel die Reihenfolge von zwei Wörtern zu wechseln, werden zwei Verschiebungen
  563. benötigt (die erste Verschiebung plaziert die Wörter übereinander). Um also die
  564. Neusortierung der Phrasen zu erlauben, muß der Ungenauigkeitsfaktor mindestens zwei
  565. sein.
  566. </para>
  567. <para>
  568. Exaktere Treffer werden höher bewertet als ungenauere Treffer, so dass die
  569. Suchergebnisse nach der Genauigkeit sortiert werden. Die Ungenauigkeit liegt
  570. standardmäßig bei 0, was exakte Treffer erfordert.
  571. </para>
  572. <para>
  573. Der Ungenauigkeitsfaktor kannnach der Erstellung der Abfrage zugeordnet werden:
  574. </para>
  575. <programlisting language="php"><![CDATA[
  576. // Query without a gap.
  577. $query =
  578. new Zend_Search_Lucene_Search_Query_Phrase(array('word1', 'word2'));
  579. // Search for 'word1 word2', 'word1 ... word2'
  580. $query->setSlop(1);
  581. $hits1 = $index->find($query);
  582. // Search for 'word1 word2', 'word1 ... word2',
  583. // 'word1 ... ... word2', 'word2 word1'
  584. $query->setSlop(2);
  585. $hits2 = $index->find($query);
  586. ]]></programlisting>
  587. </sect2>
  588. <sect2 id="zend.search.lucene.queries.range">
  589. <title>Bereichsabfragen</title>
  590. <para>
  591. <link linkend="zend.search.lucene.query-language.range">Bereichsabfragen</link> sind
  592. dazu gedacht Terme innerhalb eines spezifizierten Intervalls zu suchen.
  593. </para>
  594. <para>
  595. Abfragestring:
  596. </para>
  597. <programlisting language="querystring"><![CDATA[
  598. mod_date:[20020101 TO 20030101]
  599. title:{Aida TO Carmen}
  600. ]]></programlisting>
  601. <para>oder</para>
  602. <para>
  603. Abfrageerstellung durch die <acronym>API</acronym>:
  604. </para>
  605. <programlisting language="php"><![CDATA[
  606. $from = new Zend_Search_Lucene_Index_Term('20020101', 'mod_date');
  607. $to = new Zend_Search_Lucene_Index_Term('20030101', 'mod_date');
  608. $query = new Zend_Search_Lucene_Search_Query_Range(
  609. $from, $to, true // inclusive
  610. );
  611. $hits = $index->find($query);
  612. ]]></programlisting>
  613. <para>
  614. Begriffsfelder sind optional. <classname>Zend_Search_Lucene</classname> durchsucht alle
  615. Felder wenn das Feld nicht spezifiziert wurde:
  616. </para>
  617. <programlisting language="php"><![CDATA[
  618. $from = new Zend_Search_Lucene_Index_Term('Aida');
  619. $to = new Zend_Search_Lucene_Index_Term('Carmen');
  620. $query = new Zend_Search_Lucene_Search_Query_Range(
  621. $from, $to, false // non-inclusive
  622. );
  623. $hits = $index->find($query);
  624. ]]></programlisting>
  625. <para>
  626. Jede (aber nicht beide) der Begrenzungsausdrücke kann auf <constant>TRUE</constant>
  627. gesetzt werden. <classname>Zend_Search_Lucene</classname> sucht vom Anfang oder bis zum
  628. Ende des Verzeichnisses für die spezifizierten Feld(er) für diesen Fall:
  629. </para>
  630. <programlisting language="php"><![CDATA[
  631. // Sucht nach ['20020101' TO ...]
  632. $from = new Zend_Search_Lucene_Index_Term('20020101', 'mod_date');
  633. $query = new Zend_Search_Lucene_Search_Query_Range(
  634. $from, null, true // inclusive
  635. );
  636. $hits = $index->find($query);
  637. ]]></programlisting>
  638. </sect2>
  639. </sect1>