1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.search.lucene.query-language">
<title>Abfragesprache</title>
<para>
Java Lucene und <classname>Zend_Search_Lucene</classname> bieten sehr mächtige
Abfragesprachen.
</para>
<para>
Diese Sprachen sind großteils die selben mit ein paar kleineren Unterschieden welche
anbei erklärt werden.
</para>
<para>
Die komplette Java Lucene Syntax Dokumentation der Abfragesprache kann
<ulink url="http://lucene.apache.org/java/2_3_0/queryparsersyntax.html">hier</ulink>
gefunden werden.
</para>
<sect2 id="zend.search.lucene.query-language.terms">
<title>Ausdrücke</title>
<para>
Eine Abfrage wird in Ausdrücke und Operatoren zerteilt. Es gibt drei Arten von
Ausdrücken: Einzelne Ausdrücke, Phrasen und Unterabfragen.
</para>
<para>
Ein einzelner Ausdruck ist ein einzelnes Wort wie "Test" oder "Hallo".
</para>
<para>
Eine Phrase ist eine Gruppe von Wörtern die von doppelten Hochkommata umgeben sind wie
"Hallo Dolly".
</para>
<para>
Eine Unterabfrage ist eine Abfrage die von Klammern umgeben ist wie "(Hallo Dolly)".
</para>
<para>
Mehrere Ausdrücke können mithilfe eines boolschen Operators miteinander kombiniert
werden um komplexere Abfragen zu formen (siehe anbei).
</para>
</sect2>
<sect2 id="zend.search.lucene.query-language.fields">
<title>Felder</title>
<para>
Lucene unterstützt Felder von Daten. Wenn eine Suche durchgeführt wird kann man entweder
ein Feld spezifizieren, oder ein Standardfeld verwenden. Der Name des Feldes hängt von
den indizierten Daten ab und das Standardfeld wird durch aktuelle Einstellungen
definiert.
</para>
<para>
Der erste und größte Unterschied zu Java Lucene ist der das Ausdrücke standardmäßig
über <emphasis>alle Felder</emphasis> gesucht werden.
</para>
<para>
Es gibt zwei statische Methoden in der <classname>Zend_Search_Lucene</classname> Klasse
welche dem Entwickler das Konfigurieren dieser Einstellungen erlauben:
</para>
<programlisting language="php"><![CDATA[
$defaultSearchField = Zend_Search_Lucene::getDefaultSearchField();
...
Zend_Search_Lucene::setDefaultSearchField('contents');
]]></programlisting>
<para>
Der <constant>NULL</constant> Wert bedeutet, das die Suche über alle Felder durchgeführt
wird. Das ist die Standardeinstellung.
</para>
<para>
Es können spezielle Felder gesucht werden indem der Feldname gefolgt von einem
Doppelpunkt ":" angegeben wird, gefolgt von dem Begriff nach dem gesucht wird.
</para>
<para>
Als Beispiel nehmen wir an das ein Lucene Index zwei Felder enthält - title und text -
text ist das Standardfeld. Wenn man das "Der richtige Weg" benannte Dokument finden will
welches den Text "gehe nicht diesen Weg" enthält, geht das mit:
</para>
<programlisting language="querystring"><![CDATA[
title:"Der richtige Weg" AND text:go
]]></programlisting>
<para>
oder
</para>
<programlisting language="querystring"><![CDATA[
title:"Mach es richtig" AND go
]]></programlisting>
<para>
Weil "text" das Standardfeld ist, wird der Feld Indikator nicht benötigt.
</para>
<para>
Beachte: Das Feld nur nur für den Ausdruck, die Phrase oder die Unterabfrage gültig die
direkt danach folgt, sodas die Abfrage
</para>
<programlisting language="querystring"><![CDATA[
title:Mach es richtig
]]></programlisting>
<para>
nur "Mach" im title Feld finden wird. Es findet "es" und "richtig" im Standardfeld (wenn
das Standardfeld gesetzt ist) oder in allen indizierten Felder (wenn das Standardfeld
auf <constant>NULL</constant> gesetzt ist).
</para>
</sect2>
<sect2 id="zend.search.lucene.query-language.wildcard">
<title>Wildcards</title>
<para>
Lucene unterstützt Einzelzeichen und Mehrfachzeichen Suchen mit Wildcards in einzelnen
Ausdrücken (aber nicht innerhalb von Phrasenabfragen).
</para>
<para>
Um eine Einzelzeichen Wildcardsuche durchzuführen kann das "?" Zeichen verwendet werden.
</para>
<para>
Um eine Mehrzeichen Wildcardsuche durchzuführen kann das "*" Zeichen verwendet werden.
</para>
<para>
Die Einzelzeichen Wildcardsuche schucht nach Strings die dem Begriff entsprechen wobei
das "?" durch ein beliebiges einzelnes Zeichen ersetzt wird. Um, zum Beispiel, nach
"Text" oder "Test" zu suchen kann die folgende Suche verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
Te?t
]]></programlisting>
<para>
Mehrzeichen Wildcardsuche sucht nach 0 oder mehr Zeichen wenn Strings nach passenden
Begriffen sucht. Um, zum Beispiel, nach Test, Tests oder Tester zu suchen, kann die
folgende Suche verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
Test*
]]></programlisting>
<para>
Es können "?", "*" oder beide an jeder Stelle des Ausdrucks verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
*schrei?t*
]]></programlisting>
<para>
Sucht nach "schreibt", "schreibtisch", "beschreibt", "schreist" und so weiter.
</para>
<para>
Beginnend mit ZF 1.7.7 benötigen Wildcard Präfixe einen nicht-Wildcard Präfix. Die
standardmäßige Länge des Präfixes ist 3 (wie in Java Lucene). Die Ausdrücke
"*", "te?t", "*wr?t*" werden also eine Exception werfen
<footnote>
<para>
Es ist zu beachten das es nicht zu einer
<classname>Zend_Search_Lucene_Search_QueryParserException</classname> kommt,
sondern zu einer <classname>Zend_Search_Lucene_Exception</classname>. Sie wird
während dem Umschreiben der Abfrage geworfen.
</para>
</footnote>.
</para>
<para>
Das kann durch Verwendung der Methoden
<methodname>Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()</methodname>
und
<methodname>Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength()</methodname>
geändert werden.
</para>
</sect2>
<sect2 id="zend.search.lucene.query-language.modifiers">
<title>Ausdrücke verändern</title>
<para>
Lucene unterstützt die Veränderung von Abfrageausdrücken und bietet damit ein beites
Spektrum von Suchoptionen.
</para>
<para>
Der "~" Modifikator kann für verwendet werden um eine annähernde Suche auf Phrasen oder
Fuzzy Suchen für individuelle Ausdrücke durchzuführen.
</para>
</sect2>
<sect2 id="zend.search.lucene.query-language.range">
<title>Bereichs Suchen</title>
<para>
Bereichsabfragen erlauben es Entwicklern passende Dokumente zu finden deren Werte der
Felder zwischen der unteren und oberen Grenze sind die durch die Bereichsabfrage
spezifiziert wurden. Bereichsabfragen können inklusive oder exklusive der oberen und
unteren Grenze sein. Sortierungen werden lexikalisch durchgeführt.
</para>
<programlisting language="querystring"><![CDATA[
mod_date:[20020101 TO 20030101]
]]></programlisting>
<para>
Das wird Dokumente finden dessen lod_date Felder Werte zwischen 20020101 und 20030101
inklusive haben. Es ist zu beachten das Bereichsabfragen nicht für Datumsfelder
reserviert sind. Bereichsabfragen können auch mit nicht-datums Felder verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
title:{Aida TO Carmen}
]]></programlisting>
<para>
Das wird alle Dokumente finden dessen Titel zwischen Aida und Carmen sortiert sind,
aber ohne Aida und Carmen.
</para>
<para>
Bereichsabfragen inklusive, werden durch eine eckige Klammer abgegrenzt.
Bereichsabfragen exklusive werden durch geschlungene Klammern abgegrenzt.
</para>
<para>
Wenn kein Feld spezifiziert wurde sucht <classname>Zend_Search_Lucene</classname>
standardmäßig nach spezifizierten Intervallen in allen Feldern.
</para>
<programlisting language="querystring"><![CDATA[
{Aida TO Carmen}
]]></programlisting>
</sect2>
<sect2 id="zend.search.lucene.query-language.fuzzy">
<title>Fuzzy Suchen</title>
<para>
<classname>Zend_Search_Lucene</classname> unterstützt, genauso wie Java Lucene, die
Fuzzy Suche basierend auf der Levenshtein Distanz oder dem Edit Algorithmus. Um eine
Fuzzy Suche durchzuführen muß das Tilde Symbol "~", am Ende eines einzelnen Wortbegriffs
verwendet werden. Um zum Beispiel nach einem Begriff zu suchen der in der Aussprache
ähnlich zu "Raum" ist kann die folgende Fuzzy Suche verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
roam~
]]></programlisting>
<para>
Diese Suche wird Begriffe wie "Baum" und "Saum" finden. Zusätzliche (optionale)
Parameter können die benötigte Ähnlichkeit spezifizieren. Der Wert muß zwischen 0 und 1
sein. Mit einem Wert näher bei 1 werden nur Begriffe mit einer höheren Warscheinlichkeit
gefunden. Zum Beispiel:
</para>
<programlisting language="querystring"><![CDATA[
roam~0.8
]]></programlisting>
<para>
Der verwendete Standardwert wenn der Parameter nicht angegeben wurde ist 0.5.
</para>
</sect2>
<sect2 id="zend.search.lucene.query-language.matched-terms-limitations">
<title>Einschränkung passender Ausdrücke</title>
<para>
Wildcard, Bereichs- und Fuzzy Suchabfragen können bei zu vielen Ausdrücken passen.
Das kann die Geschwindigkeit der Suche sehr stark verlangsamen.
</para>
<para>
Deshalb setzt <classname>Zend_Search_Lucene</classname> ein Limit der passenden
Ausdrücke pro Abfrage (Unterabfrage). Dieses Limit kann durch Verwendung der Methoden
<methodname>Zend_Search_Lucene::getTermsPerQueryLimit()</methodname> und
<methodname>Zend_Search_Lucene::setTermsPerQueryLimit($limit)</methodname> empfangen und
gesetzt werden.
</para>
<para>
Das standardmäßige Limit für passende Ausdrücke ist 1024.
</para>
</sect2>
<sect2 id="zend.search.lucene.query-language.proximity-search">
<title>Angenäherte Suchen</title>
<para>
Lucene unterstützt das Finden von Wörtern aus einer Phrase die einen spezifizierten
Abstand an Wörtern in einem String weg sind. Um eine angenäherte Suche durchzuführen muß
das Tilde, "~", Symbol am Ende der Phrase verwendet werden. Um zum Beispiel nach "Zend"
und "Framework" innerhalb von 10 Wörtern zueinander in einem Dokument zu suchen kann die
folgende Suche verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
"Zend Framework"~10
]]></programlisting>
</sect2>
<sect2 id="zend.search.lucene.query-language.boosting">
<title>Einen Ausdruck schneller machen</title>
<para>
Java Lucene und <classname>Zend_Search_Lucene</classname> bieten einen Level der
Relevanz von passenden Dokumenten basierend auf den gefundenen Ausdrücken. Um die
Relevanz eines Ausdrucks zu erhöhen kann das Karet, "^", Symbol mit einem Boost Faktor
(einer Zahl) am Ende des Ausdrucks nach dem gesucht wird, verwendet werden. Je höher
Boost Faktor ist, desdo relevanter wird der Ausdruck werden.
</para>
<para>
Das boosten erlaubt die Kontrolle der Relevanz eines Dokuments durch das boosten
individueller Ausdrücke. Wenn man zum Beispiel nach
</para>
<programlisting language="querystring"><![CDATA[
PHP framework
]]></programlisting>
<para>
sucht und will das der Ausdruck "PHP" mehr Relevanz hat, kann er durch Verwendung des ^
Symbols zusammen mit einem Boost Faktor beim Ausdruck geboostet werden. Man würde zum
Beispiel folgendes angeben:
</para>
<programlisting language="querystring"><![CDATA[
PHP^4 framework
]]></programlisting>
<para>
Das macht Dokumente in denen der Ausdruck <acronym>PHP</acronym> vorkommt relevanter.
Man kann genauso Phrasenausdrücke boosten und Unterabfragen wie im Beispiel gezeigt:
</para>
<programlisting language="querystring"><![CDATA[
"PHP framework"^4 "Zend Framework"
]]></programlisting>
<para>
Standardwert ist der Boost Faktor 1. Auch wenn der Boost Faktor positiv sein muß, kann
er kleiner als 1 sein (z.B. 0.2).
</para>
</sect2>
<sect2 id="zend.search.lucene.query-language.boolean">
<title>Boolsche Operatoren</title>
<para>
Boolsche Operatoren erlauben es Ausdrücke durch logische Operatoren zu kombinieren.
Lucene unterstützt AND, "+", OR, NOT und "-" als boolsche Operatoren. In Java Lucene
müssen alle boolschen Operatoren GROßGESCHRIEBEN werden. In
<classname>Zend_Search_Lucene</classname> nicht.
</para>
<para>
AND, OR, und NOT Operatoren und "+", "-" definieren zwei unterschiedliche Stile um
boolsche Abfragen zu erstellen. Im Gegensatz zu Java Lucene erlaubt es
<classname>Zend_Search_Lucene</classname> nicht diese zwei Stile zu mischen.
</para>
<para>
Wenn der AND/OR/NOT Stil verwendet wird dann muß der AND oder OR Operator zwischen allen
Abfrageausdrücken vorhanden sein. Jedem Ausdruck kann auch ein NOT Operator
vorangestellt werden. Der AND Operator hat eine höhere Präzedenz als der OR Operator.
Das unterscheidet sich vom Verhalten von Java Lucene.
</para>
<sect3 id="zend.search.lucene.query-language.boolean.and">
<title>AND</title>
<para>
Der AND Operator bedeutet das alle Ausdrücke der "AND Gruppe" in einigen Teilen der
gesuchten Feld(er) passen müssen.
</para>
<para>
Um nach Dokumenten zu Suchen die "PHP Framework" und "Zend Framework" enthalten kann
die folgende Abfrage verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
"PHP Framework" AND "Zend Framework"
]]></programlisting>
</sect3>
<sect3 id="zend.search.lucene.query-language.boolean.or">
<title>OR</title>
<para>
Der OR Operator teilt die Abfrage in verschiedene optionale Begriffe.
</para>
<para>
Um nach Dokumenten zu Suchen die "PHP Framework" oder "Zend Framework" enthalten
kann die folgende Abfrage verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
"PHP Framework" OR "Zend Framework"
]]></programlisting>
</sect3>
<sect3 id="zend.search.lucene.query-language.boolean.not">
<title>NOT</title>
<para>
Der NOT Operator scheidet Dokumente aus die den Ausdruck nach NOT enthalten. Aber
eine "AND Gruppe" die nur Ausdrücke mit NOT Operatoren enthält, gibt ein leeres
Ergebnis zurück statt einem kompletten Set von indizierten Dokumenten.
</para>
<para>
Um nach Dokumenten zu Suchen die "PHP Framework" enthalten aber "Zend Framework"
nicht kann die folgende Abfrage verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
"PHP Framework" AND NOT "Zend Framework"
]]></programlisting>
</sect3>
<sect3 id="zend.search.lucene.query-language.boolean.other-form">
<title>&&, ||, und ! Operatoren</title>
<para>
&&, ||, und ! können statt den AND, OR und NOT Notation verwendet werden.
</para>
</sect3>
<sect3 id="zend.search.lucene.query-language.boolean.plus">
<title>+</title>
<para>
Der "+" oder benötigende Operator erfordert das der Ausdruck nach dem "+" Symbol im
passenden Dokument vorhanden ist.
</para>
<para>
Um nach Dokumenten zu Suchen die "Zend" enthalten müssen und "Framework" enthalten
können, kann die folgende Abfrage verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
+Zend Framework
]]></programlisting>
</sect3>
<sect3 id="zend.search.lucene.query-language.boolean.minus">
<title>-</title>
<para>
Der "-" oder ausschließende Operator schließt Dokumente aus die dem Ausdruck nach
dem "-" Symbol entsprechen.
</para>
<para>
Um nach Dokumenten zu Suchen die "PHP Framework" enthalten aber "Zend Framework"
nicht, kann die folgende Abfrage verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
"PHP Framework" -"Zend Framework"
]]></programlisting>
</sect3>
<sect3 id="zend.search.lucene.query-language.boolean.no-operator">
<title>kein Operator</title>
<para>
Wenn kein Operator verwendet wird, dann wird das Suchverhalten durch den
"standardmäßigen boolschen Operator" bestimmt.
</para>
<para>
Dieser ist standardmäßig auf 'OR' gesetzt.
</para>
<para>
Das impliziert das jeder Ausdruck standardmäßig optional ist. Er kann oder kann
nicht innerhalb des Dokuments enthalten sein, aber Dokumenten mit diesem Ausdruck
haben einen Höheren Stellenwert.
</para>
<para>
Um nach Dokumenten zu Suchen die "PHP Framework" benötigen und "Zend Framework"
enthalten können kann die folgende Abfrage verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
+"PHP Framework" "Zend Framework"
]]></programlisting>
<para>
Der standardmäßige boolsche Operator kann mit den
<classname>Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator)</classname>
und
<classname>Zend_Search_Lucene_Search_QueryParser::getDefaultOperator()</classname>
Methoden gesetzt oder geholt werden.
</para>
<para>
Diese Methoden arbeiten mit den
<classname>Zend_Search_Lucene_Search_QueryParser::B_AND</classname> und
<classname>Zend_Search_Lucene_Search_QueryParser::B_OR</classname> Konstanten.
</para>
</sect3>
</sect2>
<sect2 id="zend.search.lucene.query-language.grouping">
<title>Gruppieren</title>
<para>
Java Lucene und <classname>Zend_Search_Lucene</classname> unterstützen die Verwendung
von Klammern um Fälle zu gruppieren und Unterabfragen zu erstellen. Das kann nützlich
sein wenn man die boolsche Operatoren für eine Abfrage kontrollieren will, oder
unterschiedliche Abfragestile mischen will:
</para>
<programlisting language="querystring"><![CDATA[
+(Framework OR Bibliothek) +php
]]></programlisting>
<para>
<classname>Zend_Search_Lucene</classname> unterstützt Unterabfragen von beliebigen
Ebenen.
</para>
</sect2>
<sect2 id="zend.search.lucene.query-language.field-grouping">
<title>Felder gruppieren</title>
<para>
Lucene unterstützt auch die Verwendung von Klammern um mehrere Fälle in ein einzelnes
Feld zu gruppieren.
</para>
<para>
Um nach einem Titel zu suchen die sowohl das Wort "Rückkehr" und die Phrase "rosaroter
Panther" kann die folgende Abfrage verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
title:(+Rückkehr +"rosaroter Panther")
]]></programlisting>
</sect2>
<sect2 id="zend.search.lucene.query-language.escaping">
<title>Escapen von speziellen Zeichen</title>
<para>
Lucene unterstützt das Escapen von speziellen Zeichen die in der Abfragesyntax verwendet
werden. Die aktuelle Liste der speziellen Zeichen ist:
</para>
<para>
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
</para>
<para>
+ und - in einem einzelnen Ausdruck werden automatisch als normale Zeichen behandelt.
</para>
<para>
Für andere Instanzen von solchen Zeichen kann das \ vor jedem speziellen Zeichen
verwendet werden der escaped werden soll. Um zum Beispiel nach (1+1):2 zu suchen kann
die folgende Abfrage verwendet werden:
</para>
<programlisting language="querystring"><![CDATA[
\(1\+1\)\:2
]]></programlisting>
</sect2>
</sect1>
|