Zend_Search_Lucene-Queries.xml 27 KB

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