DecaTec

Home-Server | Linux | Nextcloud | Raspberry Pi | Programmierung | Fotografie

Volltextsuche in Nextcloud (mit OCR)

Nextcloud Logo

Nextcloud stellt mittlerweile eine echte Alternative zu kommerziellen Cloud-Anbietern dar. Wenn man sich erst einmal von Google, Microsoft, Dropbox, etc. losgesagt hat, wird man die eigene Nextcloud früher oder später vermehrt nutzen und so zu einem echten „Nextcloud-Power-User“.

Über die Zeit werden sich in der eigenen Cloud immer mehr Daten ansammeln, so dass man schnell mal den Überblick verlieren kann. Hier ist eine ordentliche Suchfunktion dann essentiell. Nextcloud hat bereits ab Werk eine Suchfunktion mit an Bord, diese ist allerdings eher rudimentär: Beispielsweise kann man in der Datei-Übersicht nur nach Dateinamen suchen, nicht jedoch nach Datei-Inhalten.

Update-Historie (letztes Update: 21.09.2018)
  • 21.08.2018:
    • Hinweise hinzugefügt, wenn der Elasticsearch-Dienst nach einem Update nicht mehr bei Systemstart gestartet wird.

Volltextsuche mit Full Text Search

Genau hier setzt die App Full Text Search an: Die komplette Cloud wird hier indiziert und kann danach auf einfache Art und Weise durchsucht werden. Dies beschränkt sich jedoch nicht nur auf Dateinamen, sondern auch die Inhalte von Dateien können gesucht werden.

Durch einfaches Aktivieren der App im Nextcloud App Store ist es allerdings nicht getan. Damit die App Full Text Search ihren Dienst verrichten kann, sind einige Voraussetzungen zu erfüllen. Die App ist auf eine Installation der Suchmaschine Elasticsearch angewiesen. Diese Anwendung ist wiederum in Java geschrieben, so dass ebenso eine Java-Laufzeitumgebung installiert sein muss. Der folgende Artikel beschreibt daher die Installation und Konfiguration aller benötigten Komponenten, um anschließend die Volltextsuche in Nextcloud aktivieren zu können.

Der Artikel basiert wie immer auf dem Tutorial Nextcloud auf Ubuntu Server 18.04 LTS mit nginx, MariaDB, PHP, Let’s Encrypt, Redis und Fail2ban.

Voraussetzungen

Die im Rahmen dieses Artikels installierten Programme haben an sich keine besonderen Anforderungen. Allerdings wird der Speicherverbrauch durch Elasticsearch erheblich steigen. Aus der Praxis: Elasticsearch verbraucht auf meinem Testsystem (VM mit 6 GB dynamischen RAM) über 1 GB Speicher.

Daher wird die Volltextsuche sicher auch auf einem Raspberry Pi (Affiliate-Link) laufen, dennoch wird sich dies auf einem solchen Kleinst-Computer eher zäh anfühlen.

Installation Full Text Search

Bevor die App an sich aktiviert werden kann, sind einige andere Programme zu installieren.

Wir beginnen zunächst einmal mit der Aktualisierung des Systems:

Installation der Java-Laufzeitumgebung

Zunächst überprüfen wir, ob bereits eine Java-Laufzeitumgebung installiert ist:

Wenn Java bereits installiert ist, wird die Java-Version angezeigt. Wenn dies Version 8 oder größer ist, ist hier nichts weiter zu installieren und die Installation von Java kann übersprungen werden.

Falls hier jedoch eine ältere Version oder folgende Meldung angezeigt wird, ist Java nicht aktuell oder gar nicht installiert:

Command ‚java‘ not found, but can be installed with:

apt install default-jre
apt install openjdk-11-jre-headless
apt install openjdk-8-jre-headless

In diesem Fall installieren wir die Laufzeitumgebung durch folgende Befehle:

Installation Elasticsearch

Als nächstes kann die Suchmaschine installiert werden. Dazu wird erst einmal der Key des Repositories im System bekannt gemacht, da es ansonsten später zu Warnungen während der Installation kommen wird:

Nun wird das entsprechende Repository den Paket-Sourcen hinzugefügt:

Danach wird Elasticsearch mit diesem Befehl installiert:

Konfiguration Elasticsearch

Nach der Installation muss die Suchmaschine noch fertig konfiguriert werden, bevor diese durch Nextcloud genutzt werden kann.

Elasticsearch wird nach der Installation nicht automatisch nach dem Start des Betriebssystems gestartet. Mit folgenden Befehlen wird der Dienst nach dem Systemstart automatisch mit gestartet:

Anschließend installieren wir ein Plugin für Elasticsearch, damit später auch PDF-Dateien durchsucht werden können:

Zu guter Letzt soll die Suchmaschine nur lokal angesprochen werden können. Dazu wird die Konfigurationsdatei geöffnet:

Hier suchen wir nach network.host und ändern die entsprechende Zeile ab:

Am Ende wird der Dienst neu gestartet, damit die Änderungen übernommen werden:

Installation Tesseract (für OCR)

Tesseract ist eine Software für die Texterkennung (OCR). Damit wird es möglich, Text aus Bildern zu extrahieren und damit durchsuchbar zu machen. Die Installation der OCR-Software ist optional, ist aber im Rahmen der Volltextsuche empfehlenswert, da so nicht nur in Text-Dokumenten, sondern auch in Bildern gesucht werden kann.

Was heißt das nun konkret? Man stelle ich ein Foto vor, welches mit dem Smartphone aufgenommen wurde und beispielsweise ein Ortsschild zeigt. Mittels OCR kann nun auch nach dem Namen des Ortes gesucht werden und dank Volltextsuche wird einem dieses Bild auch in den Ergebnissen angezeigt. Für mich ist das ein sehr hilfreiches Feature, daher empfehle ich die Installation von Tesseract.

Dies ist auch nicht weiter aufwändig, es reicht ein Befehl:

Hier werden auch gleich die Dateien installiert, welche für die Texterkennung für deutsche und englische Texte benötigt werden. Soll die OCR-Engine auch weitere Sprachen erkennen, so müssen zusätzlich Pakete der Form tesseract-ocr-<language> installiert werden. Eine Übersicht über alle verfügbaren Sprachen findet man hier.

Ansonsten ist nicht weiter für die Texterkennung zu installieren bzw. zu konfigurieren.

Einrichtung der Volltextsuche in Nextcloud

Nachdem nun alle Voraussetzungen installiert wurden, starten wir Elasticsearch zunächst einmal neu:

Installation der Apps für die Volltextsuche

Anschließend werden die entsprechenden Apps über den Nextcloud App Store installiert. Diese findet man in der Kategorie Suche.

Nextcloud App Store: Apps für die Volltextsuche

Nextcloud App Store: Apps für die Volltextsuche

  • Full text search: Diese App bietet die Grundfunktionen zur Volltextsuche.
  • Full text search – Elasticsearch Platform: Dies stellt die Verbindung zur Suchmaschine her.
  • Full text search – Files: Erweitert die Dateien-App um die Volltextsuche.
  • Full text search – Files – Tesseract OCR: Wenn im vorherigen Schritt die OCR-Engine installiert wurde, ist dies die Verbindung zu Tesseract.

Es gibt in dieser Kategorie evtl. noch mehrere Apps, die die Volltextsuche erweitern. Momentan gibt es hier beispielsweise noch die App für Lesezeichen: Wenn man die App Bookmarks in Nextcloud aktiviert hat, können mit Full text search – Bookmarks auch diese Lesezeichen durchsucht werden.

Konfiguration der Volltextsuche

Bevor die Volltextsuche nun verwendet werden kann, muss diese noch innerhalb Nextcloud konfiguriert werden. Dies geschieht in den Admin-Einstellungen unter Volltextsuche.

Nextcloud-Einstellungen für die Volltextsuche

Nextcloud-Einstellungen für die Volltextsuche

  • Allgemein: Allgemeine Einstellungen zur Volltextsuche.
    • Search Platform: Da momentan nur Elasticsearch installiert ist, kann man hier auch nur diesen einen Eintrag wählen.
  • Elastic Search: Einstellungen für die Suchmaschine.
    • Address of the Servlet: Dies ist die URL, unter der Elasticsearch verfügbar ist. In unserem Fall ist dies http://localhost:9200
    • Index: Eine Elasticsearch-Installation kann mehrere Such-Indizes gleichzeitig verwalten. Im diese Indizes auseinanderzuhalten zu können, wird hier der Name des Such-Indexes angegeben. Dies kann eine beliebige Zeichenfolge sein, z.B. der Domain-Name der Cloud-Instanz.
  • Dateien: Einstellungen für die Datei-Suche.
    • Damit sowohl lokale Dateien, als auch Dateien indiziert werden, die auf externem Speicher liegen, aktivieren wir hier sowohl Local files, als auch External Files.
  • Types: Einstellungen für verschiedene Dateitypen.
    • Wir aktivieren hier Extract PDF, als auch Extract Office, damit auch PDF- und Office-Dateien durchsucht werden können. Dazu muss zuvor das Elasticsearch-Plugin ingestattachment installiert worden sein.
  • Files – Tesseract OCR: Einstellungen für die Texterkennung mit Tesseract.
    • Enable OCR: Muss aktiviert werden, damit die Volltextsuche OCR verwenden kann.
    • Languages: Hier sind alle Sprachen anzugeben, die zuvor im Rahmen der Installation von Tesseract mit installiert wurden. In unserem Fall: eng,deu

Die Einstellungen werden direkt nach der Eingabe übernommen.

Index anlegen

Nachdem die Volltextsuche nun einsatzbereit ist, muss der erste Index über das Kommandozeilentool occ angelegt werden. Dies geschieht über folgenden Befehl:

Achtung: Je nach Größe der Nextcloud-Instanz kann dieser Befehl sehr lange dauern. Wenn ihr also bereits viele Dateien in eurer Nextcloud gespeichert habt, rechnet mal mit ein paar Stunden, bevor der erste Index erzeugt wurde.

Nach dem ersten Erzeugen des Indexes muss der o.g. Befehl nicht mehr regelmäßig ausgeführt werden. Die Aktualisierung des Indexes erfolgt dann im Rahmen des Cronjobs von Nextcloud.

Wichtig dafür ist nur, dass Nextcloud auch so konfiguriert wurde, dass ein Cronjob genutzt wird. Bei einer Ausführung von Hintergrundaufgaben per AJAX wird der Suchindex nicht auf dem Laufenden gehalten.

Die Volltextsuche in Aktion

Nach dem Anlegen des Indexes kann die Volltextsuche nun ganz einfach in Nextcloud genutzt werden. In der Datei-Übersicht kann die Suche wie bisher verwendet werden, nur dass diese nun durch die Volltextsuche ersetzt wurde.

Nextcloud Volltextsuche: Suche nach Datei-Inhalten

Nextcloud Volltextsuche: Suche nach Datei-Inhalten

Bei der Neuanlage von Dokumenten dauert es übrigens ein wenig, bis diese durch die Volltextsuche gefunden werden können. Das liegt daran, dass ein neues Dokument erst mit dem nächsten Cronjob-Lauf in den Index mit aufgenommen wird. Das sollte allerdings maximal 15 Minuten dauern.

Wenn Tesseract als OCR-Engine installiert wurde, kann nun nicht nur nach dem Inhalt von Dokumenten, sondern auch nach Bild-Inhalten (Text in Bildern) gesucht werden.

Syntax für die Suche

Zum Schluss noch ein paar Hinweise für die Syntax beim Suchen über Full Text Search:

  • Nextcloud
    Findet Dateien, die „Nextcloud“ im Pfad/Dateinamen oder als Inhalt haben.
  • Nex*
    Findet Dateien, die „Nex“ und weitere Zeichen im Pfad/Dateinamen oder als Inhalt haben (also z.B. Nextcloud, Nexus, etc.).
  • Nextcloud Volltextsuche App
    Findet Dateien, die „Nextcloud“ oder „Volltextsuche“ oder „App“ im Pfad/Dateinamen oder als Inhalt haben.
  • „Nextcloud Volltextsuche“ App
    Findet Dateien, die „Nextcloud Volltextsuche“ oder „App“ im Pfad/Dateinamen oder als Inhalt haben (hier wird z.B. eine Datei mit „Nextcloud und Volltextsuche“ nicht gefunden).
  • +Nextcloud Volltextsuche App
    Findet Dateien, die auf jeden Fall „Nextcloud“ und vielleicht „Volltextsuche“ oder „App“ im Pfad/Dateinamen oder als Inhalt haben.
  • +“Nextcloud Volltextsuche“ -App
    Findet Dateien, die auf jeden Fall „Nextcloud Volltextsuche“, aber nicht „App“ im Pfad/Dateinamen oder als Inhalt haben.
  • Nextcloud in:filename
    Findet Dateien, die „Nextcloud“ im Pfad oder Dateinamen enthalten (funktioniert dann wie die Standard-Suche in Nextcloud, die nur nach Dateinamen/Pfaden suchen kann).
  • Nextcloud in:content
    Findet Dateien, die „Nextcloud“ als Inhalt haben.

Update Elasticsearch

Da wir Elasticsearch in die Paketquellen eingetragen haben, wird von Zeit zu Zeit ein Update von Elasticserarch installiert werden, wenn das System mit apt-get upgrade auf den neusten Stand gebracht wird.

Nach einem Update kann es passieren, dass die Volltextsuche in Nextcloud nicht mehr funktionsfähig ist und folgende Fehlermeldung ausgibt:

No alive nodes found in your cluster

In diesem Fall ist der Dienst für Elasticsearch vermutlich nicht gestartet. Überprüft werden kann dies mit:

Falls hier angezeigt wird, dass der Dienst nicht gestartet werden konnte, sollten auf jeden Fall die Logs kontrolliert werden:

In den meisten Fällen wird hier das Plugin „ingest-attachment“ verantwortlich sein, was man an folgender Fehlermeldung sehen kann.

org.elasticsearch.bootstrap.StartupException: java.lang.IllegalArgumentException: Plugin [ingest-attachment] was built for Elasticsearch version 6.4.0 but version 6.4.1 is running

Hier muss das Plugin aktualisiert werden. Zunächst wird die alte Version entfernt:

Anschließend kann die aktualisierte Version installiert werden:

 

Nach einem Neustart des Systems sollte der Dienst wieder gestartet sein und die Volltextsuche sollte in Nextcloud auch wieder funktionieren.

Falls nicht, sollte der Dienst nochmal so konfiguriert werden, dass dieser beim Systemstart mitgestartet wird:

Fazit

Eine Volltextsuche ist eine sinnvolle Erweiterung für jede Nextcloud-Installation. Gerade wenn in der Cloud nach einiger Zeit sehr viele Dateien gespeichert sind, wird man die Volltextsuche zu schätzen wissen. Ebenso kommt es vor, dass man zwar weiß, dass in irgendeinem Dokument bestimmte Inhalte zu finden sind, man sich aber nicht mehr erinnert, in welcher Datei diese Inhalte zu finden sind. Mit der Volltextsuche ist auch das kein Problem mehr.

Die OCR-Erweiterung durch Tesseract sorgt darüber hinaus, dass auch nach Inhalten in Bildern gesucht werden kann. Dies macht dann besonders Sinn, wenn man z.B. die Fotos vom Smartphone mit Hilfe der Nextcloud-App automatisch in die Cloud hochladen lässt.

Auch wenn die Einrichtung der Volltextsuche in Nextcloud etwas aufwändiger ist und zusätzliche System-Ressourcen benötigt werden, der Aufwand wird sich in den meisten Fällen allerdings wirklich lohnen.

Weiterführende Artikel

Links

, , , , , , , , ,

Kommentare: 72

  • vatolin sagt:

    Der Fehler ist wohl auf der Seite von Full Text Search zu suchen:

    pi@raspberrypi:~ $ sudo -u www-data php /home/pi/usbdrive/html/occ files:scan –all
    Starting scan for user 1 out of 2 (roebbe)
    Starting scan for user 2 out of 2 (vatolin)
    +———+——-+————–+
    | Folders | Files | Elapsed time |
    +———+——-+————–+
    | 1266 | 14332 | 00:03:02 |
    +———+——-+————–+

    An dieser Stelle schon mal ganz herzlichen Dank für die Hilfe! Wie geht es nun weiter?

    • Jan sagt:

      Hi,

      dann handelt es sich wohl echt um ein Problem mit Full Text Search.
      Als nächstes würde ich mal ins Log von Elasticsearch schauen: /var/log/elasticsearch/elasticsearch.log
      Wenn hier nichts zu finden sein sollte, dann würde ich mal im Nextcloud-Forum nachfragen oder einen Issue auf GitHub erstellen.

      Gruß,
      Jan

  • vatolin sagt:

    pi@raspberrypi:~ $ sudo -u www-data php /home/pi/usbdrive/html/occ fulltextsearch:test

    .Testing your current setup:
    Creating mocked content provider. ok
    Testing mocked provider: get indexable documents. (2 items) ok
    Loading search platform. (Elasticsearch) ok
    Testing search platform. fail
    In Test.php line 300:

    Search platform (Elasticsearch) down ?

    fulltextsearch:test [–output [OUTPUT]] [-j|–json] [-d|–platform_delay PLATFORM_DELAY]

  • vatolin sagt:

    Ist das die richtige Java-Version?

    pi@raspberrypi:~ $ java -version
    openjdk version „1.8.0_181“
    OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
    OpenJDK Client VM (build 25.181-b13, mixed mode)

    • Jan sagt:

      Hi,

      die Java-Version ist die richtige. Allerdings sieht es in deinem vorherigen Kommentar so aus, als ob der Elasticsearch Service gar nicht laufen würde.
      Was ergibt „service elasticsearch status“?
      Hast du schon ins Log von Elasticsearch geschaut?

      Gruß,
      Jan

  • vatolin sagt:

    pi@raspberrypi:~ $ service elasticsearch status
    ● elasticsearch.service – LSB: Starts elasticsearch
    Loaded: loaded (/etc/init.d/elasticsearch; generated; vendor preset: enabled)
    Active: active (exited) since Fri 2019-04-19 19:37:18 BST; 3 days ago
    Docs: man:systemd-sysv-generator(8)
    Process: 1684 ExecStop=/etc/init.d/elasticsearch stop (code=exited, status=0/S
    Process: 1717 ExecStart=/etc/init.d/elasticsearch start (code=exited, status=0
    CGroup: /system.slice/elasticsearch.service

    Apr 19 19:37:18 raspberrypi systemd[1]: Starting LSB: Starts elasticsearch…
    Apr 19 19:37:18 raspberrypi systemd[1]: Started LSB: Starts elasticsearch.

    • Jan sagt:

      Hi,

      das sieht so aus, als ob Elasticsearch nicht laufen würde. Was passiert, wenn du den Service manuell startest („service elasticsearch start“) und danach nochmal den Status überprüfst?
      Wenn es dann läuft, ist Elasticsearch generell mal lauffähig. In diesem Fall ist das Problem wohl nur, dass nach System-Neustart der Service nicht gestartet wird. In diesem Fall sollte ein „update-rc.d elasticsearch defaults“ helfen.
      Wenn der Service auf manuell nicht gestartet werden kann, dann führt nichts mehr daran vorbei, die Logs von Elasticsearch zu analysieren.

      Gruß,
      Jan

  • vatolin sagt:

    Auch nach einem einem Reboot des Raspberry und einem manuellen Start(versuch?) sieht das nicht anders aus:

    pi@raspberrypi:~ $ sudo service elasticsearch start
    pi@raspberrypi:~ $ sudo service elasticsearch status
    ● elasticsearch.service – LSB: Starts elasticsearch
    Loaded: loaded (/etc/init.d/elasticsearch; generated; vendor preset: enabled)
    Active: active (exited) since Wed 2019-04-24 13:07:26 BST; 40s ago
    Docs: man:systemd-sysv-generator(8)
    Process: 556 ExecStart=/etc/init.d/elasticsearch start (code=exited, status=0/SUCCESS)
    CGroup: /system.slice/elasticsearch.service

    Apr 24 13:07:26 raspberrypi systemd[1]: Starting LSB: Starts elasticsearch…
    Apr 24 13:07:26 raspberrypi systemd[1]: Started LSB: Starts elasticsearch.
    pi@raspberrypi:~ $ sudo -u www-data php /home/pi/usbdrive/html/occ fulltextsearch:index

    In Index.php line 380:

    failed platform test.

    fulltextsearch:index [–output [OUTPUT]] [-r|–no-readline] [–] []

    Wo muss ich denn nach den Logs von Elasticsearch suchen, um sie zu finden?

    Gruß. Friedrich

  • vatolin sagt:

    Da ist leider kein Logfile. Das Verzeichnis ist leer:

    pi@raspberrypi:/var/log/elasticsearch $ ls -al
    total 8
    drwxr-xr-x 2 elasticsearch elasticsearch 4096 May 20 2016 .
    drwxr-xr-x 10 root root 4096 Apr 24 13:07 ..

    Gruß. Friedrich

  • Friedrich sagt:

    Könnte es sein, dass die von hier

    echo „deb https://artifacts.elastic.co/packages/6.x/apt stable main“ | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

    installierte Version von Elasticsearch auf einem Raspberry Pi 3+ gar nicht lauffähig ist?

    • Jan sagt:

      Hi Friedrich,

      ich denke, dass das schon funktionieren sollte. Wenn in der entsprechenden Paketquelle kein passendes Paket gefunden werden könnte, dann würde er schon beim apt-get update meckern.
      Wenn sich Elasticsearch installieren lässt, dann wurde auch das passende Paket gefunden.
      Was läuft bei dir denn nicht? Lässt sich der Dienst nicht starten?

      Gruß,
      Jan

1 2

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.