From f2a5ce0a3f39c047d040b62bd16b948064d2443a Mon Sep 17 00:00:00 2001 From: Felix Lohmeier Date: Mon, 22 May 2017 10:15:09 +0200 Subject: [PATCH] =?UTF-8?q?Kapitel=205=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 5-0-erweiterungsmoeglichkeiten.md | 8 +- ...aetzliche-daten-ueber-oai-schnittstelle.md | 116 +++++++++ ...relevanzranking-mit-typo3-find-und-solr.md | 229 ++++++++++++++++++ README.md | 3 +- SUMMARY.md | 2 + 5 files changed, 353 insertions(+), 5 deletions(-) create mode 100644 5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md create mode 100644 5-2-relevanzranking-mit-typo3-find-und-solr.md diff --git a/5-0-erweiterungsmoeglichkeiten.md b/5-0-erweiterungsmoeglichkeiten.md index f677276..17211ce 100644 --- a/5-0-erweiterungsmoeglichkeiten.md +++ b/5-0-erweiterungsmoeglichkeiten.md @@ -1,8 +1,8 @@ # 5 Erweiterungsmöglichkeiten -Ziel: ... +Ziel: Vertiefung der erlernten Techniken. -Bitte nehmen Sie sich für die folgenden Abschnitte insgesamt etwa 8 Stunden Zeit: +Bitte wählen Sie einen der folgenden Abschnitte und nehmen Sie sich dafür etwa 8 Stunden Zeit: -* [...]() -* [...]() +* [Zusätzliche Daten über OAI-Schnittstelle](5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md) +* [Relevanzranking mit TYPO3-find und Solr](5-2-relevanzranking-mit-typo3-find-und-solr.md) diff --git a/5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md b/5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md new file mode 100644 index 0000000..bf7820c --- /dev/null +++ b/5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md @@ -0,0 +1,116 @@ +# 5.1 Zusätzliche Daten über OAI-Schnittstelle + +Über das Protokoll [OAI-PMH](http://www.openarchives.org/OAI/openarchivesprotocol.html) (Open Archives Initiative Protocol for Metadata Harvesting) können Metadaten vieler Repositorien heruntergeladen werden. Eine standardkonforme OAI-Schnittstelle unterstützt mindestens das Ausgabeformat Dublin Core, oft werden zusätzliche Formate wie MARC oder MODS unterstützt. Über weitere Variablen kann die Abfrage nach Datum oder Teilbeständen gesteuert werden. + +In dieser Aufgabe laden Sie Daten via OAI-PMH aus einem Repositorium, bearbeiten Sie mit OpenRefine und indexieren die Daten im Suchindex. + +Das internationale Forschungsdatenrepository [Zenodo](http://www.zenodo.org) bietet eine gut implementierte OAI-Schnittstelle, die auch über den Browser "erkundet" werden kann: +* Schnittstelle: https://zenodo.org/oai2d?verb=Identify +* Dokumentation: http://developers.zenodo.org/#oai-pmh + +Beispiel "European Commission Funded Research (OpenAIRE)": +* In dieser Community liegen etwa 3.800 Dokumente, wie eine Suche zeigt: https://zenodo.org/communities/ecfunded/search?page=1&size=20 +* Auf der [Übersichtsseite der Community](https://zenodo.org/communities/ecfunded/) steht ein Link zu Informationen für das Harvesting über OAI-PMH. In der URL selbst sind die Parameter abzulesen, die benötigt werden. Beispiel: https://zenodo.org/oai2d?verb=ListRecords&set=user-ecfunded&metadataPrefix=oai_dc. Daran können Sie ablesen, dass das Set "user-ecfunded" heißt. + +## 1. OAI Harvesting + +Es gibt sehr viele Clients, um OAI-Schnittstellen abzufragen. VuFind hat beispielsweise einen umfangreichen [OAI-Harvester](https://github.com/vufind-org/vufindharvest) integriert, der auch eigenständig benutzt werden kann. Wir nutzen für diese Aufgabe einen schlanken kommandozeilenbasierten Client, der in Python geschrieben wurde: https://github.com/bloomonkey/oai-harvest. Der Entwickler heißt John Harrison und arbeitet an der Universität von Liverpool. + +### 1.1 Installation: + +``` +sudo apt-get install sqlite3 python3-pip +sudo python3 -m pip install git+https://github.com/infrae/pyoai.git +sudo python3 -m pip install git+http://github.com/bloomonkey/oai-harvest.git#egg=oaiharvest +``` + +### 1.2 Download: + +``` +mkdir zenodo +oai-harvest https://zenodo.org/oai2d -s user-ecfunded -p oai_dc -d zenodo +``` + +### 1.3 Die Dateien sollten nun im "Persönlichen Ordner" im Unterverzeichnis "zenodo" liegen. 3800 Einzeldateien in OpenRefine zu laden schlägt leicht fehl, daher ist es sinnvoll diese Dateien vorher ein Zip-Archiv zu packen und dann diese Zip-Datei in OpenRefine zu laden: + +``` +zip -r zenodo.zip zenodo +``` + +## 2. Verarbeitung mit OpenRefine + +### 2.1 OpenRefine starten + +```~/openrefine-2.7-rc.2/refine``` + +### 2.2 Projekt erstellen + +Zip-Datei hochladen und bei der Auswahl des Pfads auf die erste Zeile () klicken + +### 2.3 Spalten umbenennen, damit Sie auf die Felder im Schema des Suchindex passen (z.B. "oai_dc:dc - dc:title" in "Titel" umbenennen). Dabei müssen Sie Bezeichnungen verwenden, die im Schema vorhanden sind: + +* Titel +* Urheber +* Medientyp +* Sprache +* Jahr +* Link + +Für den Import in Solr ist zudem eine Spalte "id" zwingend technisch notwendig. Diese kann aus der Spalte "File" gebildet werden. Weitere mögliche Felder können Sie dem Schema unter http://localhost:8983/solr/#/gettingstarted/schema entnehmen. + +### 2.4 Überflüssige Spalten löschen + +### 2.5 Mehrfachbelegungen + +* Spalte id (ehemals File) / Blank down +* Spalten mit Mehrfachbelegungen zusammenführen mit Edit cells / Join multi-valued cells.... Wählen Sie dabei ein Trennzeichen, dass nicht in den Daten vorkommt. Am besten das Sonderzeichen Unit Separator ␟ +http://unicode-table.com/en/241F/ +* Leere Zeilen löschen + +### 2.6 Daten exportieren als TSV + +* Es sollten jetzt 3805 Zeilen sein. +* Menü Export / Tab-separated value. Datei wird vom Firefox Browser im Ordner Downloads gespeichert. +* OpenRefine beenden: ```STRG```+```C``` im Terminal, in dem OpenRefine läuft + +## 3. Daten in Suchindex laden + +### 3.1 Solr starten + +```~/solr-6.5.0/bin/solr start -s ~/solr-6.5.0/example/schemaless/solr``` + +### 3.2 Daten laden + +Wechseln Sie in der Kommandozeile in das Verzeichnis mit den gespeicherten Daten (z.B. mit ```cd Downloads```) und geben Sie dann den folgenden Befehl zum Laden der Daten ein. In dem Befehl muss der Dateiname der zu importierenden Datei angegeben werden, also: ```test.tsv``` durch den Dateinamen der mit OpenRefine exportierten Datei ersetzen. + +```curl "http://localhost:8983/solr/gettingstarted/update/csv?commit=true&separator=%09" --data-binary @test.tsv -H 'Content-type:text/plain; charset=utf-8'``` + +Falls Sie eine Fehlermeldung "Error adding field 'Jahr'='2014-09-21'" erhalten, dann liegt das daran, dass in unserem Schema im Feld Jahr nur Nummern zugelassen sind. In diesem Fall müssen Sie das Projekt noch einmal in OpenRefine laden, die Trennzeichen im Feld Jahr entfernen (z.B. mit der Transformation ```value[0,4]``` und die Datei nochmal exportieren. + +Wenn Sie mehrfachbelegte Felder aufsplitten wollen, müssen Sie die URL innerhalb der Anführungszeichen (mehrfach) ergänzen. Beispiel für Titel: + +```&f.Titel.split=true&f.Titel.separator=%E2%90%9F``` + +Vollständiger Befehl für Beispiel Titel: + +```curl "http://localhost:8983/solr/gettingstarted/update/csv?commit=true&separator=%09&f.Titel.split=true&f.Titel.separator=%E2%90%9F" --data-binary @test.tsv -H 'Content-type:text/plain; charset=utf-8'``` + +## 3.3 TYPO3 Ergebnis prüfen + +http://localhost in der virtuellen Maschine aufrufen, um den Katalog anzuzeigen + +Die Facetten funktionieren nicht, wenn dort Sonderzeichen wie ```:``` oder ```&``` enthalten sind. Diese müssen in OpenRefine entfernt oder ersetzt werden. + +Der Befehl zum Leeren des gesamten Suchindex lautet: + +``` +curl "http://localhost:8983/solr/gettingstarted/update?commit=true&stream.body=%3Cdelete%3E%3Cquery%3E*%3A*%3C/query%3E%3C/delete%3E" +``` + +Anschließend können Sie die Daten neu indexieren (siehe oben Schritt 3.2) + +## Literatur + +* Open Archives Initiative Protocol for Metadata Harvesting: http://www.openarchives.org/OAI/openarchivesprotocol.html +* OAI-Schnittstelle der Deutschen Nationalbibliothek: http://www.dnb.de/DE/Service/DigitaleDienste/OAI/oai_node.html +* OAI-Schnittstelle von Zenodo: http://developers.zenodo.org/#oai-pmh diff --git a/5-2-relevanzranking-mit-typo3-find-und-solr.md b/5-2-relevanzranking-mit-typo3-find-und-solr.md new file mode 100644 index 0000000..67ff30f --- /dev/null +++ b/5-2-relevanzranking-mit-typo3-find-und-solr.md @@ -0,0 +1,229 @@ +# 5.2 Relevanzranking mit TYPO3-find und Solr + +TYPO3-find basiert auf dem Suchindex Solr, weshalb für das Relevanzranking die Konfigurationsmöglichkeiten von Solr genutzt werden können. Eine Verbesserung der Relevanzsortierung von Trefferlisten kann in der Praxis bereits durch eine einfache Gewichtung der Felder erzielt werden. + +* Relevanz ist abhängig vom Nutzungskontext, d.h. von der Person, die sucht und von ihrem Erkenntnisinteresse zum jeweiligen Zeitpunkt. +* Discovery-Systeme versuchen eine subjektiv als "gut" empfundene Relevanzsortierung durch eine unterschiedliche Gewichtung der verschiedenen Metadatenfelder (Titel, UrheberIn, Beschreibungstext) herzustellen. +* Wenn die Daten uneinheitlich sind (z.B. wenn zu einem Objekt viele und zu einem anderen Objekt sehr wenige beschreibende Daten vorliegen), dann führt dies oft zu unerwarteten Rankings, weil der Suchindex in der Standardkonfiguration das Verhältnis der Suchtreffer in einem Dokument zur Gesamtlänge des Dokuments in die Berechnung der Relevanzsortierung einfließen lässt. +* Weil die Definition eines Algorithmus auf Basis von objektiven Kriterien so schwer fällt, wird in der Praxis die Gewichtung der Felder oft experimentell auf Basis von häufig durchgeführten Suchen austariert. Nutzerstudien sind beim Relevanzranking also besonders wichtig. + +## 1. Solr Schema anpassen und neu indexieren + +Die Suchabfragen werden in Solr durch einen Parser interpretiert. Der voreingestellte Parser erlaubt keine einfache Gewichtung von Feldern, daher nutzen wir den sogenannten "eDismax" Parser. + +Weil dieser nicht mit Feldern funktioniert, die als "string" konfiguriert sind, müssen wir zunächst das Schema ändern. Dafür nutzen wir die [Schema API](https://cwiki.apache.org/confluence/display/solr/Schema+API). + +### 1.1 Solr starten + +``` +~/solr-6.5.0/bin/solr start -s ~/solr-6.5.0/example/schemaless/solr +``` + +### 1.2 Schema ändern + +``` +curl -X POST -H 'Content-type:application/json' --data-binary '{ + "replace-field":[ + { "name":"ISBN", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"DDC", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Datum", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"LCC", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"ISSN", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Urheber", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Titel", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Medientyp", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": false }, + { "name":"Sprache", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Ort", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Verlag", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Jahr", + "type":"tlong", + "stored":true, + "indexed": true, + "docValues": false, + "multiValued": false }, + { "name":"Beschreibung", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Schlagwoerter", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Beitragende", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Reihe", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Vorgaenger", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Nachfolger", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }, + { "name":"Link", + "type":"text_general", + "stored":true, + "indexed": true, + "multiValued": true }] +}' http://localhost:8983/solr/gettingstarted/schema +``` + +### 1.3 Core neu laden, damit die Konfigurationsänderung wirksam wird + +``` +curl "http://localhost:8983/solr/admin/cores?action=RELOAD&core=gettingstarted" +``` + +### 1.4 Index leeren + +``` +curl "http://localhost:8983/solr/gettingstarted/update?commit=true&stream.body=%3Cdelete%3E%3Cquery%3E*%3A*%3C/query%3E%3C/delete%3E" +``` + +### 1.5 Neu indexieren (dauert 5-10 Minuten...) + +``` +curl "http://localhost:8983/solr/gettingstarted/update/csv?commit=true&separator=%09&f.ISBN.split=true&f.ISBN.separator=%E2%90%9F&f.ISSN.split=true&f.ISSN.separator=%E2%90%9F&f.Sprache.split=true&f.Sprache.separator=%E2%90%9F&f.LCC.split=true&f.LCC.separator=%E2%90%9F&f.DDC.split=true&f.DDC.separator=%E2%90%9F&f.Urheber.split=true&f.Urheber.separator=%E2%90%9F&f.Ort.split=true&f.Ort.separator=%E2%90%9F&f.Verlag.split=true&f.Verlag.separator=%E2%90%9F&f.Datum.split=true&f.Datum.separator=%E2%90%9F&f.Beschreibung.split=true&f.Beschreibung.separator=%E2%90%9F&f.Schlagwoerter.split=true&f.Schlagwoerter.separator=%E2%90%9F&f.Beitragende.split=true&f.Beitragende.separator=%E2%90%9F&f.Reihe.split=true&f.Reihe.separator=%E2%90%9F&f.Vorgaenger.split=true&f.Vorgaenger.separator=%E2%90%9F&f.Nachfolger.split=true&f.Nachfolger.separator=%E2%90%9F&f.Link.split=true&f.Link.separator=%E2%90%9F&f.Titel.split=true&f.Titel.separator=%E2%90%9F" --data-binary @hsh-ksf.tsv -H 'Content-type:text/plain; charset=utf-8' +``` + +## 2. TYPO3-Find Konfiguration erweitern + +Auch hier muss der Parser eDismax in der Konfiguration aktiviert werden. Rufen Sie dazu die TYPO3-Administrationsoberfläche in der virtuellen Maschine auf http://localhost/typo3/ und wählen Sie im Menü List / Seite "Home" das Template "Main TypoScript Rendering". Ersetzen Sie dort den vorhandenen Eintrag im Textfeld Setup durch folgenden Abschnitt und drücken Sie anschließend den Save-Button: + +``` +page = PAGE +page.100 < styles.content.get +page.javascriptLibs.jQuery = 1 +page.includeJS.find = EXT:find/Resources/Public/JavaScript/find.js +plugin.tx_find.features.requireCHashArgumentForActionArguments = 0 +plugin.tx_find.settings { + connections { + default { + options { + host = localhost + port = 8983 + path = /solr/gettingstarted + } + } + } + standardFields { + title = Titel + snippet = Urheber + } + facets { + 10 { + id = Medientyp + field = Medientyp + sortOrder = count + } + 20 { + id = Sprache + field = Sprache + sortOrder = count + } + 30 { + id = Jahr + field = Jahr + sortOrder = count + } + } + features { + eDisMax = 1 + } +} +``` + +## 3. Relevanzranking einstellen + +Im folgenden Befehl sind alle Felder mit Faktor 1 gewichtet. Variieren Sie die Zahlen und entfernen Sie Felder, die Sie aus dem Relevanzranking ausschließen wollen. Die Änderungen werden erst wirksam, wenn Sie den Index neu laden. Prüfen Sie die Ergebnisse im Katalog, machen Sie Beispielsuchen und nähern Sie sich Stück für Stück einem effektiven Relevanzranking an. + +### 3.1 Konfiguration ändern + +``` +curl http://localhost:8983/solr/gettingstarted/config -H 'Content-type:application/json' -d '{ + "update-requesthandler": { + "name": "/select", + "class":"solr.SearchHandler", + "defaults":{ + "echoParams":"explicit", + "rows":"10" + }, + "appends":{ + "defType":"edismax", + "qf":"ISBN^1 DDC^1 Datum^1 LCC^1 ISSN^1 Urheber^1 Titel^1 Medientyp^1 Sprache^1 Ort^1 Verlag^1 Jahr^1 Beschreibung^1 Schlagwoerter^1 Beitragende^1 Reihe^1 Vorgaenger^1 Nachfolger^1 Link^1" + } + } +}' +``` + +### 3.2 Core neu laden, damit die Konfigurationsänderung wirksam wird + +``` +curl "http://localhost:8983/solr/admin/cores?action=RELOAD&core=gettingstarted" +``` + +### 3.3 Ergebnis prüfen + +http://localhost + +## Literatur + +* Präsentation von Elmar Haake: Relevanzranking als Erfolgsfaktor für Discoverysysteme. http://docplayer.org/3530893-Relevanzranking-als-erfolgsfaktor-fuer-discoverysysteme-elmar-haake-staats-und-universitaetsbibliothek-bremen.html +* Hajo Seng: Relevance-Ranking auf dem VuFind-Anwendertreffen (siehe die dort verlinkten Papiere und Vortragsfolien). http://beluga-blog.sub.uni-hamburg.de/blog/2015/10/02/relevance-ranking-auf-dem-vufind-anwendertreffen-2015/ +* Solr/Lucene Score Tutorial: http://www.openjems.com/solr-lucene-score-tutorial/ +* The Extended DisMax Query Parser: https://cwiki.apache.org/confluence/display/solr/The+Extended+DisMax+Query+Parser diff --git a/README.md b/README.md index 077a614..95bb3ab 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,8 @@ Kapitel 4: Prototyp eines Katalogs mit TYPO3-find bauen * [4.2 Zwischenfazit](4-2-0-zwischenfazit.md) Kapitel 5: Erweiterungsmöglichkeiten -* ... +* [5.1 Zusätzliche Daten über OAI-Schnittstelle](5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md) +* [5.2 Relevanzranking mit TYPO3-find und Solr](5-2-relevanzranking-mit-typo3-find-und-solr.md) ## Lerntagebücher diff --git a/SUMMARY.md b/SUMMARY.md index ba89f47..76626ae 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -47,5 +47,7 @@ * [4.2.1 Was haben wir im Seminar erreicht?](4-2-1-was-haben-wir-im-seminar-erreicht.md) * [4.2.2 Was fehlt noch für einen Produktivbetrieb?](4-2-2-was-fehlt-noch-fuer-einen-produktivbetrieb.md) * [Kapitel 5](5-0-erweiterungsmoeglichkeiten.md) + * [5.1 Zusätzliche Daten über OAI-Schnittstelle laden und mit OpenRefine verarbeiten](5-1-zusaetzliche-daten-ueber-oai-schnittstelle.md) + * [5.2 Relevanzranking mit TYPO3-find und Solr konfigurieren](5-2-relevanzranking-mit-typo3-find-und-solr.md) * [Lerntagebücher](lerntagebuecher.md) * [Prüfungsleistungen](pruefungsleistungen.md)