-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Catch-All-Feldsuche durch gewichtete Suche in einzelnen Indexfeldern ersetzen #37
Comments
Auf den ersten Blick sieht es so aus, als ob der aktuelle DisMaxQueryParser ideal wäre. http://lucene.apache.org/solr/guide/7_3/the-extended-dismax-query-parser.html Momentan werden eine Vielzahl von Inhalten in unser Suchfeld für die einfache Suche geschrieben. Dementsprechend wird die Liste an Felder, die durchsucht werden sollen, etwas länger sein. Wir müssen prüfen, ob es da vielleicht Probleme gibt. Es müssen Experimente durchgeführt werden. |
Ein Vorteil wäre, dass man dann zum Beispiel die einzelnen Volltext-Extraktionen separat in dynamischen Feldern speichern könnte, so dass evtl. auch erkennbar wäre in welcher Datei ein Stichwort gefunden wurde. Manche Dokumente werden in Repositorien über mehrere PDF-Dateien verteilt gespeichert. |
Wir machen das nur für die PHP 8 Version mit Solr 9. |
Ich frage mich, ob es nicht einfacher ist den Code in opus4-search erst umzubauen, bevor die neue Funktionalität hinzugefügt wird. Im Augenblick ist sehr schwer zu erkennen an welchen Stellen Änderungen vorgenommen werden müssen, um nur die einfache Suche zu ersetzen. Im Prinzip wird aus der "einfachen" Suche, ja eine "komplexe" Suche, bei der der Solr-Request zahlreiche zusätzliche Parameter hat. |
Die Funktion Vielleicht lässt sich das Boosting über zusätzliche Funktionen der Solarium-API hinzufügen, ohne den Rest ändern zu müssen. Die Liste der Felder für die einfache Suche muss sich natürlich verändern. Die Gewichte für die zu durchsuchenden Felder können dann aus der Konfiguration ausgelesen werden. Ich denke aber wir können das nicht einfach für alle Suchen machen, sondern erst einmal nur für Simple-Search. Die Informationen sollten also aus dem OPUS 4-Query Objekt kommen, das für die Gewichte erweitert werden muss. Die Information, wenn vorhanden wird dann in Das sind theoretische Überlegungen. Bei der Umsetzungen können sich weitere Probleme oder bessere Ansätze zeigen. |
Zur (manuellen) Prüfung sollte geschaut werden wie die generierten und an Solr geschickten Queries aussehen. Falls es dafür noch keine guten Debug-Tools gibt, sollte dafür ein weiteres Ticket angelegt werden, um diese Tools zu schaffen. Ein einfache DEBUG-Level logging würde ja erst einmal reichen, wenn es noch nicht vorhanden ist. |
Über Solr's Bei der gewichteten Suche lässt sich über den Zusätzlich liesse sich bei einer Suchanfrage mit mehreren Begriffen (z.B. "foo OR bar") die Gewichtung von gefundenen Dokumenten weiter "boosten", indem man das Vorkommen einer exakten Phrase ("foo bar", siehe Weniger relevante Ergebnisse liessen sich bei einer Suchanfrage mit mehreren Begriffen ausschliessen, indem man z.B. vorgibt, dass von drei Suchbegriffen (z.B. "foo OR bar OR baz") mindestens zwei in den gefundenen Dokumenten vorkommen müssen ("foo AND bar" oder "foo AND baz" oder "bar AND baz", siehe |
Für eine alternative, gewichtete Suche wäre also nicht unbedingt ein zusätzlicher Endpoint (und Solr RequestHandler) nötig. Dies würde höchstens notwendig sein, wenn man für die gewichtete Suche feste Default-Werte definieren möchte, die selten oder gar nicht in der Konfiguration überschrieben werden. Man kann aber stattdessen auch immer alle Parameter bei der aktuellen Suchanfrage mitgeben. |
Die OPUS 4-Search API enthält das Konzept "NamedSearch" bei denen ein Teil der Suchparameter aus der Konfiguration kommt. Das wurde nie genutzt und soll auch jetzt nicht verwendet werden. Die zusätzlichen Möglichkeiten die Gewichtung zu steuern, können über die Konfiguration verfügbar gemacht werden, wenn der Aufwand im Augenblick nicht wesentlich ist. |
…(using the eDisMax query parser) works as expected
…ights influences the order of results
…ng for missing or equal boost factors to a separate test
…ds() which will read the configuration only once
In der lokalen Konfiguration, Mein Vorschlag wäre, eine weitere Option hinzufügen, etwas wie Eine alternative Lösung wäre es eine Gewichtung von "0" oder auch "off" als Schalter zu verwenden, um Felder wegzulassen. Das würde ohne Profile funktionieren. Ich denke das sollte zusätzlich und zuerst implementiert werden. Profile sind trotzdem nützlich weil es die Möglichkeit bietet leicht zwischen verschiedenen Konfigurationen umzuschalten, insbesondere für Testzwecke, und der Aufwand sich in vertretbaren Grenzen hält. Später lagern wir Profile vielleicht in separate Dateien aus, die leicht geteilt werden können. |
Eine Feld-Gewichtung von "0" wird von Solr standardmässig akzeptiert und weisst einem Dokument mit ausschliesslichem Match in diesem Feld dann entsprechend den Score "0" zu. Falls es für ein Dokument noch Matches in anderen Feldern gibt, so trägt das auf "0" gesetzte Feld auch nicht zum ermittelten Score bei.
|
Das besprechen wir im nächsten Meeting. Für die Überlegungen vorab, nur noch folgendes. Es geht darum ein Feld komplett aus der Suche heraus zu nehmen, insbesondere z.B. das Volltextfeld. Das die Gewichtung "0" für Solr ja offensichtlich eine Bedeutung hat, sollte dann ein "off" Wert in der Konfiguration dafür sorgen, dass für das entsprechende Feld keine Gewichtung angegeben wird und das Feld nicht im Query Parameter fl auftaucht. Die Konfiguration der Gewichtungen soll ja auch die Liste der zu durchsuchenden Felder bestimmen. Es klingt so, als ob das noch nicht der Fall ist. |
Solr Doku zum Thema: |
Danke für die Links. Ich habe die Seiten kurz überflogen. Bei den Änderungen, die wir machen wollen geht es darum, die einfache Suche in OPUS 4 zu ersetzen. Eine Suche bei der der Nutzer nicht wissen muss wie die Felder im Index heißen. Wir wollen ein einzelnes Feld, dass alles enthält, durch eine Liste von expliziten Feldern für verschiedene Inhalte ersetzen, die unterschiedlich gewichtet werden können. Dabei soll sich für die Nutzer der einfachen Suche nichts ändern. Wie sich dabei die Verwendung von Solr-Query-Syntax auswirkt, müssen wir ausprobieren, aber sie darf nicht notwendig sein. Von außen soll sich nichts ändern, außer einer hoffentlich verbesserten Reihenfolge der Suchergebnisse, nach einem angemessenen Tuning der Gewichtungen. |
Ja, das ist mir klar. Aber ich habe bislang keine in allen Fällen funktionierende Lösung gefunden, um mit der gewichteten Suche in mehreren aber nicht allen Feldern zu suchen. Man kann ein StandardFeld ( Eine alternative (und mir als einfacher erscheinende) Möglichkeit wäre es, einfach ungewünschte Felder in der Konfig auf "0" zu setzen und beim Verarbeiten der Solr-Ergebnisse ( |
…t getWeightedSearch() can load its value from the config if it isn't set yet
…quest parameter that's used when matching phrases
…a; by default, Solr's standard query parser will now only search the "title" field; adopts test accordingly
… default Setting a field's boost factor to 0 (via the "search.simple" config option) will cause documents with matches just in that field to get a score of 0
…ighted search (which searches across all defined fields instead of just the title field)
Momentan werden für die einfache Suche alle Daten, die berücksichtigt werden sollen, in ein einziges Feld kopiert, die Metadaten und die Volltexte. Dadurch werden die Titel und die Angaben zu den Autoren genauso behandelt wir der Text des Dokuments. Es findet keine Gewichtung statt.
Diese Lösung rührt von ursprünglichen Limitationen in Solr, die mittlerweile nicht mehr bestehen.
Die Suche soll umgestellt werden, um Feldern eine unterschiedliche Gewichtung geben zu können und damit die Suchergebnisse relevanter zu machen.
Intern: https://tickets.zib.de/jira/browse/OPUSVIER-1571
The text was updated successfully, but these errors were encountered: