Kontextfilterung mit Solr Suggester
„Q: What did the Filter Query say to the Solr Suggester? Einführung Die verfügbare Literatur über den Solr Suggester konzentriert…
"Q: What did the Filter Query say to the Solr Suggester?
Einführung
Die verfügbare Literatur über den Solr Suggester konzentriert sich hauptsächlich auf die oberflächliche Konfiguration und allgemeine Anwendungsfälle. Dieser Artikel bietet eine gründliche Einführung in den Solr Suggester und erörtert seine Geschichte, sein Design, seine Implementierung und bietet sogar einige umfassende Beispiele für seine Verwendung.
Dieser Blog-Beitrag soll die Vielseitigkeit des Solr Suggesters und den Prozess der Erstellung von kontextgefilterten Vorschlägen in Solr aufzeigen.
Ein wenig Kontext…
Angenommen, Sie haben eine Sammlung, die aus verschiedenen Datenquellen besteht. Für dieses Beispiel wählen wir zwei der Datenquellen, „datasource_A“ und „datasource_B“. Das Ziel ist es, Vorschläge für Ihre Suchanwendung zu aktivieren, aber nur Vorschläge für Dokumente aus Datenquelle_A zu liefern und alle Dokumente aus Datenquelle_B auszuschließen.
Geben Sie „suggest.cfq“ ein, den Parameter, der bis zu einem gewissen Grad den bekannten fq-Parameter von Solr emuliert. Der weit verbreitete fq-Parameter filtert jedoch nicht die Ergebnisse, die von der suggest-Komponente ausgegeben werden. Wenn Sie also eine Abfrage wie /suggest?q=do&fq=_lw_data_source_s:datasource_A ist im Wesentlichen gleichbedeutend mit /suggest?q=dound ignoriert die Filterabfrage vollständig.
In der Solr-Dokumentation finden Sie einen Hinweis darauf, dass die Kontextfilterung (suggest.cfq
) derzeit nur von AnalyzingInfixLookupFactory und BlendedInfixLookupFactory unterstützt wird, und auch nur dann, wenn ein Document*Dictionary zugrunde liegt. Alle anderen Implementierungen geben ungefilterte Treffer zurück, als ob keine Filterung angefordert worden wäre.
Darf ich eine Lösung vorschlagen?
Im folgenden Beispiel erstelle ich eine Fusion-Sammlung mit dem Namen suggestTest und weise ihr zwei Datenquellen zu: „art“ und „tv“ In Fusion werden Datenquellen durch ein Feld _lw_data_source_s unterschieden. Nachdem ich die Dokumente beider Datenquellen indiziert habe, möchte ich die Vorschläge für eine der Datenquellen aktivieren, nicht aber für die andere.
Ich habe ein Skript erstellt, das den Prozess, den ich gleich beschreiben werde, automatisiert – Sie können das Skript ausführen, indem Sie das folgende Repo klonen: https://github.com/essiequoi/suggestTest.git
SCHRITT 1
Stellen Sie sicher, dass Sie die folgenden Umgebungsvariablen setzen, da sonst die Standardeinstellungen verwendet werden:
$FUSION_HOME (z.B.: $HOME/Lucid/fusion/fusion2.4.3/)
$FUSION_API_BASE (z.B.: http://localhost:8764/api/apollo)
$SOLR_API_BASE (z.B.: http://localhost:8983/solr)
$FUSION_API_CREDENTIALS (z.B.: admin:password123)
$ZK_HOST (z.B.: localhost:9983)
SCHRITT ZWEI
Erstellen Sie die suggestTest-Sammlung
SCHRITT DREI
Bearbeiten Sie solrconfig.xml, um Vorschläge zu aktivieren. Wie bereits erwähnt, haben Sie die Wahl, ob Sie die AnalyzingInfixLookupFactory oder die BlendedInfixLookupFactory als Wörterbuchimplementierung verwenden. In meinem Beispiel verwende ich die erstere. Wir werden auf das Feld title hinweisen. Der Parameter contextField gibt das Feld an, nach dem Sie filtern werden. Ich verwende das Feld _lw_data_source_s, das den Namen der Fusion-Datenquellen enthält.
SCHRITT VIER
Erstellen Sie die Datenquellen „art“ und „tv“. Ich verwende den lokalen Dateisystem-Connector für beide, aber der Connector-Typ ist in diesem Beispiel beliebig. Und da ich CSV-Dateien indiziere, verwende ich die standardmäßige CSV-Index-Pipeline, die mit Fusion geliefert wird. Ich indiziere die folgenden Dokumente:
kunst.csv
tv.csv
SCHRITT FÜNF
Führen Sie die Datenquellen aus. Sobald beide Datenquellen ausgeführt wurden, sollten Sie insgesamt 6 Dokumente in Ihrer gesamten Sammlung haben.
SCHRITT SECHS
Bearbeiten Sie in der Abfrage-Pipeline suggestTest-default die Stufe Query Solr, um den /suggest requestHandler zuzulassen.
SCHRITT SIEBEN
Erstellen Sie den Suggestor mit http://{host}:8764/api/apollo/query-pipelines/suggestTest-default/collections/suggestTest/suggest?suggest.build=true . Der Status „0“ bedeutet, dass der Suggestor erfolgreich erstellt wurde.
SCHRITT ACHT
Fragen Sie die Sammlung (mit dem /suggest Handler) nach „ba“ ab und beobachten Sie die Antwort. Als nächstes fragen Sie nach „be“ und dann nach „ch“. Sie sollten für jede Abfrage 2 Vorschläge zurückerhalten.
SCHRITT NEUN
Nehmen wir an, wir möchten Vorschläge für „ba“ erhalten, aber nur solche, die aus der Datenquelle „art“ stammen. Die folgende Abfrage schlägt fehl: http://{host}:8764/api/apollo/query-pipelines/suggestTest-default/collections/suggestTest/suggest?suggest.q=ba&fq=_lw_data_source_s:art . Wie Sie sehen können, werden immer noch Vorschläge aus beiden Datenquellen zurückgegeben. Wenn Sie den Parameter suggest.cfq verwenden und die entsprechende Datenquelle als Wert eingeben, erhalten Sie das richtige Ergebnis.
SCHRITT ZEN
Suchen Sie weiter!
Einige bekannte Probleme
Es ist wichtig zu wissen, dass die folgenden JIRAs in Bezug auf den suggest.cfq-Parameter existieren, von denen keines direkt den oben genannten Anwendungsfall betrifft:
SOLR-8928 – „suggest.cfq funktioniert nicht mit DocumentExpressionDictionaryFactory/weightExpression“
SOLR-7963 – „Abfrage des Suggester-Kontextfilters, um die Abfrage lokaler Parameter zu akzeptieren“
SOLR-7964 – „suggest.highlight=true funktioniert nicht bei der Verwendung von Kontextfilter-Abfragen“
Fazit
Der Solr Suggester ist von Haus aus in der Lage, selbst die speziellsten Anwendungsfälle zu lösen. Wenn Sie Ihre Konfigurationsdateien ein wenig anpassen und ebenso viel experimentieren, können Sie Ihre Anwendung für eine Vielzahl von Möglichkeiten öffnen.
A: Con-text me some time.