Solr-gestützte ISFDB – Teil #6: Pseudonyme
Dies ist Teil 6 einer (nicht enden wollenden?) Artikelserie über das Indizieren und Durchsuchen der ISFDB.org-Daten mit Solr.
Als wir uns das letzte Mal trennten, hatte ich eine anständige Modellierung von Titeln und Autoren in verschiedenen Dokumenten, aber Pseudonyme wurden als verschiedene Autoren behandelt. Heute habe ich mir vorgenommen, das zu ändern.
(Wenn Sie zu Hause mitarbeiten möchten, können Sie den Code auf github auschecken. Ich beginne mit dem blog_5-Tag und werde im Laufe des Artikels auf bestimmte Commits verweisen, in denen ich etwas geändert habe, bis hin zum blog_6-Tag, der das Endergebnis dieses Artikels enthält).
Was ist ein Pseudonym?
In der realen Welt ist ein Pseudonym nur ein alternativer Name, den jemand benutzt. In der ISFDB werden Pseudonyme als echte Autorenobjekte modelliert, mit Metadaten, die angeben, dass sie eine Pseudonymbeziehung zu einem anderen Autorenobjekt haben.
Dies hat einige unangenehme Auswirkungen auf unser bestehendes Solr-Dokumentenmodell:
- In einem autorenzentrierten Dokument gibt es weder einen Hinweis darauf, ob der Autor ein Pseudonym hat, noch gibt es eine Möglichkeit, den Autor anhand eines Pseudonyms zu suchen.
- In einem autorenzentrierten Dokument gibt es keinen Hinweis darauf, ob der Autor ein Pseudonym für einen anderen Autor ist, und es gibt auch keine Möglichkeit, dieses Pseudonym anhand des echten Namens des Autors zu suchen.
- In einem titelzentrierten Dokument gibt es keinen Hinweis darauf, ob einer der aufgelisteten Autoren ein Pseudonym für einen anderen (echten) Autor ist, und es gibt auch keine Möglichkeit, den Titel nach dem echten Namen des Autors zu suchen.
Wie bereits in Blog #3 erwähnt, geht es bei der Dokumentenmodellierung darum, flach zu denken und die Daten zu denormalisieren, und so werden wir versuchen, mit Pseudonymen umzugehen.
Indizierung von Pseudonymen für echte Autoren
Die Bewältigung des ersten Problems war relativ einfach. Es war im Grunde nicht anders, als wenn wir eine Liste von E-Mail-Adressen für jeden Autor mit einer verschachtelten Entität hinzugefügt hätten (und da die Liste der Pseudonyme wiederum relativ klein ist, können wir das Ganze mit dem CachedSqlEntityProcessor im Speicher zwischenspeichern)
Wenn wir also eine Suche nach einem Autor namens Asimov durchführen, sehen wir nicht nur „Isaac Asimov“ in der Liste, sondern auch, dass es 6 Pseudonyme für ihn gibt, und wir haben die ID für jedes dieser Pseudonyme, wenn wir einen dieser Datensätze nachschlagen oder sehen wollen, welche Titel dieses Pseudonym geschrieben hat
Um dies wirklich nützlich zu machen, wollen wir natürlich auch ein einfaches „Namens“-Feld für Autorendokumente, das alle verschiedenen Namen auflistet, unter denen der (echte) Autor bekannt ist. <copyField />
macht dies trivial, so dass eine Suche nach Autoren mit dem Namen „French“ nicht nur den Alias „Paul French“, sondern auch den echten Autor „Isaac Asimov“ ergibt.
Indizierung echter Namen für Pseudonym-Autoren
Mein Ansatz zum Hinzufügen der „echten“ Namen (und IDs) zu pseudonymen Autorendokumenten war im Grunde derselbe wie das Hinzufügen von Pseudonymnamen/IDs zu „echten“ Autorendokumenten. Ich würde gerne sagen, dass es eine einfache Möglichkeit gibt, die zuvor zwischengespeicherte verschachtelte Entität in DIH zu verändern und wiederzuverwenden, um eine Rückwärtssuche durchzuführen, aber ich konnte keine finden. Wenn wir jetzt nach Autoren namens „Isaac Asimov“ suchen, erhalten wir nicht nur den „echten“ Isaac, sondern auch seine verschiedenen Pseudonyme. Wenn wir Synonyme von einer Autorensuche ausschließen möchten, können wir eine einfache Filterabfrage hinzufügen: fq=-real_author_id:[* TO *]
.
Ich wollte die Filterung nach Pseudonymen einfacher machen (und die Facettierung erleichtern), indem ich ein Feld „is_pseudonym“ hinzufügte. Eine Möglichkeit, dies zu tun, wäre gewesen, den TemplateTransformer für meine verschachtelte Entität „pseudonym_real_author“ zu verwenden – aber ich war mir ziemlich sicher, dass dies nur für Autoren gelten würde, die eine Zuordnung zu dieser verschachtelten Entität hatten; ich möchte, dass der Boolesche Wert für alle Autorendokumente gesetzt wird. Also habe ich stattdessen meinen ersten ScriptTransformer verwendet, um den Wert des Feldes zu setzen.
Mein erster Versuch hat überhaupt nicht so funktioniert, wie ich es erwartet hatte. Für jeden Autor enthielt die Zeile nie einen Wert für die „real_author_id“, wenn mein Skript ausgeführt wurde, also war is_pseudonym immer falsch. Soweit ich das beurteilen kann, scheint es so zu sein, dass das Skript ausgeführt wurde, sobald die „Zeile“ mit Daten aus der „Abfrage“ der obersten Ebene gefüllt wurde, da der Transformer auf der obersten Ebene „author“ angegeben wurde. (Disclaimer: Ich habe mich nicht mit dem Code beschäftigt, um dies zu überprüfen, aber wenn ich das Wiki noch einmal lese, ergibt es Sinn). Ich konnte keinen einfachen Weg finden, dies zu umgehen, also habe ich es vorerst herausgenommen und werde es mir später genauer ansehen.
Abschweifung: Entscheidungen bei der Dokumentenmodellierung
Eine kurze Abschweifung, bevor wir mit dem Hinzufügen von Pseudonym-Informationen zu Titeldokumenten fortfahren: Ich möchte darauf hinweisen, dass ich im vorangegangenen Abschnitt eine bewusste Entscheidung zur Dokumentenmodellierung getroffen habe, indem ich beschlossen habe, dass „Pseudonym-Autoren“ weiterhin wie jeder andere Autor indiziert werden – sie haben ein paar zusätzliche Felder. Insbesondere haben sie immer noch einen „doc_type“ von „AUTHOR“. Eine andere Möglichkeit, die ich hätte wählen können, wäre die Einführung eines neuen doc_type „PSEUDO_AUTHOR“ gewesen. Ich kann nicht wirklich erklären , warum ich diese Wahl getroffen habe, es fühlte sich einfach besser an angesichts der vagen Vorstellungen, die ich davon habe, wie ich diesen Index verwenden möchte. Ich möchte leicht erkennen können, ob ein Autor wirklich ein Pseudonym für einen anderen Autor ist, aber ich muss/will diese pseudonymen Dokumente nicht als Bürger zweiter Klasse behandeln. Vielleicht stoße ich in Zukunft auf einen speziellen Anwendungsfall, der meine Meinung ändert, aber im Moment ist es sinnvoll, sie weiterhin wie normale Autoren zu behandeln.
Echte Namen für Titel indizieren
Mein erster Versuch, den echten Namen/die echte ID für jeden Autor eines Titels zu indizieren, war im Grunde derselbe wie für die Autorendokumente. Ich fügte einfach eine verschachtelte Entität hinzu, indem ich die Tabelle Pseudonyme verwendete. Das Problem bei diesem Ansatz war, dass die Liste der „real_author_names“ und „real_author_ids“ in jedem Titel kürzer war als die Liste der anerkannten Autoren, wenn einige „real“ und andere Pseudonyme waren, da nur Felder für Pseudonyme hinzugefügt wurden. Zum Beispiel hat„The Lost“ vier anerkannte Autoren, aber einer von ihnen („J. D. Robb“) ist ein Pseudonym (für „Nora Roberts“). So sahen diese Felder in den Ergebnissen aus…
<arr name="author_ids"> <str>2857</str> <str>36103</str> <str>136275</str> <str>35293</str> </arr> <arr name="author_names"> <str>J. D. Robb</str> <str>Mary Blayney</str> <str>Patricia Gaffney</str> <str>Ruth Ryan Langan</str> </arr> <arr name="real_author_ids"> <str>4853</str> </arr> <arr name="real_author_names"> <str>Nora Roberts</str> </arr>
Man kann nicht wirklich sagen, wer wer ist, oder?
Um dies zu verbessern, habe ich die spezielle Unterentität für Pseudonym-Beziehungen entfernt und stattdessen die bestehende Unterentität „Autor“ so geändert, dass sie einen LEFT JOIN mit der Pseudonym-Tabelle durchführt, um die gleichen Felder zu füllen. (Da es sich bei LEFT JOIN um ein DB-Konzept handelt und nicht um etwas Besonderes für Solr oder DIH, werde ich mir nicht die Mühe machen, es hier zu erklären, aber Sie können es online nachlesen). Jetzt sehen die gleichen Felder also wie folgt aus…
<arr name="author_ids"> <str>2857</str> <str>36103</str> <str>136275</str> <str>35293</str> </arr> <arr name="author_names"> <str>J. D. Robb</str> <str>Mary Blayney</str> <str>Patricia Gaffney</str> <str>Ruth Ryan Langan</str> </arr> <arr name="real_author_ids"> <str>4853</str> <str>36103</str> <str>136275</str> <str>35293</str> </arr> <arr name="real_author_names"> <str>Nora Roberts</str> <str>Mary Blayney</str> <str>Patricia Gaffney</str> <str>Ruth Ryan Langan</str> </arr>
Das macht sie sehr viel nützlicher.
Fazit (vorläufig)
Ok, damit beenden wir diesen letzten Teil mit dem blog_6 Tag. Der Index ist ziemlich gut in Form. Wir können jetzt einige ziemlich interessante Abfragen nach Titeln und Autoren durchführen, indem wir entweder die echten Namen der Autoren oder die von ihnen verwendeten Pseudonyme verwenden. Ich denke, nächste Woche werde ich mir die Hände schmutzig machen und etwas an der Benutzeroberfläche arbeiten, damit ich ein paar Bildschirmfotos zeigen kann.