Verschachtelte Abfragen in Solr
Die Möglichkeit, einen beliebigen Abfragetyp innerhalb eines anderen Abfragetyps zu verschachteln, ist eine nützliche Funktion, die vor einiger Zeit still…
Die Möglichkeit, einen beliebigen Abfragetyp innerhalb eines anderen Abfragetyps zu verschachteln, ist eine nützliche Funktion, die vor einiger Zeit still und heimlich zu Solr hinzugefügt wurde, zusammen mit der Unterstützung für Abfrageparser-Plugins zur Unterstützung verschiedener Abfragetypen. Ich bin endlich dazu gekommen, verschachtelte Abfragen für den Funktionsabfrageparser zu reparieren und dachte mir, dass es höchste Zeit war, verschachtelte Abfragen zu dokumentieren, zusammen mit der LocalParams-Syntax, die es erlaubt, Metadaten zu einem Abfrageparameter hinzuzufügen oder sogar den Typ einer Abfrage zu ändern (d.h. welcher Abfrageparser zum Parsen des Abfrage-Strings verwendet wird). Das könnte Sie auch interessieren: Optimierung der Auffindbarkeit in Lucene und Solr oder das Solr Referenzhandbuch.
Verschachtelte Abfragen in der Lucene-Syntax
Um eine Abfrage eines anderen Typs in einen Lucene/Solr-Abfrage-String einzubetten, verwenden Sie einfach den magischen Feldnamen _query_. Das folgende Beispiel bettet eine Lucene-Abfrage vom Typ:poems in eine andere Lucene-Abfrage ein:
text:"roses are red" AND _query_:"type:poems"
Dies ist natürlich für sich genommen nicht sehr nützlich, aber in Verbindung mit dem Query Parser Framework und lokalen Parametern, die es uns ermöglichen, die Abfragetypen zu ändern, wird es sehr mächtig. Das folgende Beispiel bettet eine DisMax-Abfrage in eine normale Lucene-Abfrage ein:
text:hi AND _query_:"{!dismax qf=title pf=title}how now brown cow"
Außerdem können wir in der Syntax von local params das Defererencing von Parametern verwenden, um es dem Frontend zu erleichtern, die Anfrage zusammenzustellen:
&q=text:hi AND _query_:"{!dismax qf=title pf=title v=$qq} &qq=how now brown cow
Verschachtelte Abfragen in der Funktionsabfragesyntax
Dieser Teil war früher defekt und ist erst in Solr 1.4 oder höher behoben/verfügbar. Sie können die Funktion query() verwenden, um jede andere Art von Abfrage in eine Funktionsabfrage einzubetten und Berechnungen mit den von dieser Abfrage zurückgegebenen Relevanzwerten durchzuführen. Einige Beispiele aus dem Solr-Wiki finden Sie hier.
Reine verschachtelte Abfrage
Es gibt auch ein Parser-Plugin für verschachtelte Abfragen, mit dem Sie reine verschachtelte Abfragen erstellen können. Ist eine verschachtelte Abfrage ohne eine enthaltende Abfrage überhaupt nützlich? Überraschenderweise ja, denn sie ermöglicht eine weitere Zerlegung von Abfrageanfragen. Mit der folgenden Abfrage kann der Kunde beispielsweise auf einfache Weise angeben, dass er eine Art Aktualitätserhöhung in die Relevanzbewertung einfließen lassen möchte, während er den genauen Abfragetyp der Solr-Serverkonfiguration überlässt (über die Suchhandler-Vorgaben in solrconfig.xml). Die Client-Abfrage würde die Erhöhungsabfrage als $datefunc angeben:
q=how now brown cow&bq={!query v=$datefunc}
Und die Standardeinstellungen für den Handler in solrconfig.xml würden die eigentliche Definition von datefunc als Funktionsabfrage enthalten:
<lst name="defaults"> <str name="datefunc">{!func}recip(rord(date),1,1000,1000)</str> [...]
Dieselbe Idee könnte verwendet werden, um einem Kunden zu ermöglichen, zwischen komplexen Filtern zu wechseln, ohne dass er angeben muss, was diese Filter sind. Ohne den verschachtelten Abfrageparsertyp wäre es nur möglich, den Abfragewert an einer separaten Stelle (über local params v=$param) anzugeben, nicht aber den Typ selbst.
Die Zukunft
In Solr 5.5 (über SOLR-839) wurde ein XML Query Parser hinzugefügt, mit dem beliebig komplexe Lucene-Abfragen in XML ausgedrückt werden können. Da die Anzahl der Abfrageparser wächst, wird es immer wichtiger, dass Sie sie mischen, anpassen und verschachteln können. Eine der ersten Erweiterungen des XML-Query-Parsers sollte natürlich die Einbindung verschachtelter Abfragen sein! Die Unterklassen von QParserPlugin zeigen alle derzeit für Solr verfügbaren Abfrageparser. Wenn Sie den gewünschten Abfrageparser nicht finden, können Sie Ihren eigenen erstellen und ihn über solrconfig.xml registrieren!
Foto mit freundlicher Genehmigung von Lori L. Stalteri (Flickr). Solr-Logo hinzugefügt.