Abfrageparser erkunden
Es gibt eine überraschende Anzahl von Abfrageparser-Optionen in der Lucene/Solr-Welt – etwas, das ich in meinen frühen Lucene-Tagen nicht so…
Es gibt eine überraschende Anzahl von Abfrageparser-Optionen in der Lucene/Solr-Welt – etwas, das ich in meinen frühen Lucene-Tagen nicht so schnell erkannt habe. Ich dachte, ich könnte ein paar der Optionen hervorheben, die es gibt.
Der Standard Lucene QueryParser [Lucene]
Dieser Parser ist wohl der bekannteste und beherrscht eine gesunde Syntax, die die meisten der Lucene zugrunde liegenden Abfrageobjekte umfasst. Das meiste, was Sie vom Standard-Query-Parser erwarten würden – mit der Ausnahme, dass es ihm an Unterstützung für Span-Queries mangelt und er Operator-Präzendenz auf eine sehr unintuitive Weise behandelt. Auch die Unterstützung für die Feldauswahl ist eher schwach. Sie wurde in der Vergangenheit als Spüle bezeichnet, aber für viele Anwendungsfälle funktioniert sie eigentlich ganz gut. Syntaxfehler könnten viel eleganter behandelt werden. Andererseits erhält dieser Parser die meiste Aufmerksamkeit, und Sie haben ihn wahrscheinlich schon als nützlich empfunden.
Beispiel Syntax:
mod_date:[20020101 TO 20030101]
title:(-return +“pink panther“)
(jakarta OR apache) AND website
„jakarta apache“ – „Apache Lucene“
MultiFieldQueryParser [Lucene]
Eine Weiterentwicklung des Standard-Lucene-Parsers, die es Ihnen ermöglicht, ein Array von Feldern für die Suche anzugeben. Dies erleichtert die Abfrage mehrerer Felder mit einer kürzeren Syntax.
Beispiel Syntax:
sear?h roam~0.8 wor* Im Code können Sie die Felder übergeben: [title, body, keywords]
PrecedenceQueryParser [Lucene]
Contrib enthält eine weitere Variante des Standard-QueryParsers namens PrecedenceQueryParser. Dieser Parser versucht, die Unterstützung für Präzedenzfälle in QueryParser intuitiver und nützlicher zu machen – ansonsten ist er dem Standardparser ziemlich ähnlich. In der Java-Dokumentation für diesen Parser steht, dass er noch experimentell und unvollständig ist.
Beispiel Syntax:
Im Allgemeinen dieselbe Syntax wie der standardmäßige Lucene QueryParser, aber es wird versucht, den Vorrang sinnvoller zu behandeln.
Surround [Lucene]
Surround ist ein cooler Parser, der vor einiger Zeit von Paul Elschot entwickelt wurde. Surround bietet eine Syntax, die mit fast allen Lucene-Abfrageobjekten funktioniert. Vor allem unterstützt er die Familie der Span-Abfragen sehr gut. Surround erkennt entweder eine Post- oder Infix-Notation.
Beispiel Syntax:
aa NOT bb NOT cc – Gleicher Effekt wie: (aa NOT bb) NOT cc
and(aa,bb,cc) – aa und bb und cc
99w(aa,bb,cc) – geordnete span-Abfrage mit Slop 98
99n(aa,bb,cc) – ungeordnete span-Abfrage mit Slop 98
20n(aa*,bb*)
3w(a?a oder bb?, cc+)
title:text: aa nicht bb
cc 3w dd – infix: dual.
Xml-Query-Parser [Lucene]
Der xml-query-parser ist ein cooler Beitrag von Mark Harwood. Er kann xml-Dateien parsen, die angeben, welche Abfrageobjekte konstruiert werden sollen (was die Unterstützung der gesamten Lucene-Abfragefamilie erleichtert). Der xml-query-parser ist leicht auf neue Abfragetypen erweiterbar und übernimmt sogar das einfache Filter-Caching für Sie. Wenn Sie noch ein wenig XSLT hinzufügen, vervielfacht sich die Coolness.
Beispiel-Syntax:
<BooleanQuery fieldName="contents"> <Clause occurs="should"> <TermQuery>merger</TermQuery> </Clause> <Clause occurs="mustnot"> <TermQuery>sumitomo</TermQuery> </Clause> <Clause occurs="must"> <TermQuery>bank</TermQuery> </Clause> </BooleanQuery>
Qsol [Lucene/Solr?]
Ich habe diesen QueryParser vor ein paar Jahren mit dem Ziel geschrieben, etwas zu entwickeln, das die Suche nach Sätzen/Absätzen innerhalb von n Proximity ermöglicht, die Syntax älterer Abfragen in gewisser Weise nachahmt, eine Mischung aus Proximity- und booleschen Klauseln zulässt (z.B. {mark | miller} within3wordsOf toast) und den Vorrang von Operatoren auf konfigurierbare Art und Weise korrekt behandelt. Qsol kann in dieser Hinsicht ziemlich mächtig sein, aber die Codebasis ist für einen QueryParser ziemlich umfangreich und ich habe mich schon seit einiger Zeit nicht mehr damit beschäftigt – abgesehen von gelegentlichen Bugfixes. Die meisten Benutzer von Qsol haben eher Nischenanforderungen, wenn es um einen QueryParser geht. Qsol ist bis zum Gehtnichtmehr konfigurierbar.
Ich habe gesehen, dass jemand vor einiger Zeit einen Teil von Qsol auf Solr portiert hat, aber ich bin mir nicht sicher, wie weit dieser Patch fortgeschritten ist.
Beispiel-Syntax:
bush & chain | cheney
basketball love ! hate
(bill | william) ~3 clinton
field1,field2(horse | dog)
*:* ! hor*
SolrQueryParser [Solr]
Dies ist im Wesentlichen der Standard Lucene QueryParser, der so erweitert wurde, dass er eine engere Integration mit Solr unterstützt. Gewisse Unterschiede gibt es allerdings zu verschiedenen Zeiten – zum Beispiel hat der SolrQueryParser vor dem Lucene QueryParser konstante Ergebnisse bei Abfragen mit mehreren Begriffen erzielt.
Beispiel-Syntax:
Die Syntax ist die gleiche wie die Standard-Syntax von Lucene – das Verhalten kann jedoch für bestimmte Fälle angepasst werden.
DisMax [Solr]
DisMax schränkt die zulässige Syntax stark ein (Anführungszeichen und nur +/-) und ermöglicht Ihnen die einfache Angabe mehrerer Felder für die Suche mit unterschiedlichen Boosts für jedes Feld. Dies ist eine gute Lösung für die unfreundliche Behandlung von Syntaxfehlern durch den standardmäßigen Lucene QueryParser. DisMax bietet Ihnen etwas, das der Funktionsweise Ihrer bevorzugten Web-Suchmaschine sehr viel näher kommt.
Beispiel Syntax:
eine großartige Suche, die ich nutzen könnte, um
+Pferd „Rinder und Schweine“ -ratten
Gaz{sdf*?verhinon