Volltextsuche in Nextcloud einrichten

Nextcloud unterstützt eine Suche über die Weboberfläche und in den Clients. Dabei werden aber nur Dateinamen verglichen und nicht in Dateinhalten gesucht. Es gibt aber die Möglichkeit, eine Volltextsuche einzurichten.

Installation von Elasticsearch unter Ubuntu/Debian

Java Laufzeitumgebung

Die Volltextsuche von Nextcloud baut auf Elasticsearch auf, was unabhängig davon installiert werden muss. Elasticsearch ist eine Java-basierte Suchmaschine, weshalb zunächst sichergestellt sein muss, dass Java verfügbar ist. Mit dem folgenden Befehl kann man prüfen, ob Java bereits installiert ist:

java -version

Als Ergebnis sollte eine Ausgabe ähnlich wie dieser hier erscheinen:

openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.18.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.18.04, mixed mode, sharing)

Falls statt dessen eine Meldung wie Command 'java' not found ausgegeben wird, muss eine Java-Laufzeitumgebung noch installiert werden, z.B. unter Ubuntu Linux wie folgt:

apt install openjdk-11-jre

Elasticsearch installieren

Danach kann das Repository für Elasticsearch wie folgt hinzufügen und Elastisearch installieren:

apt install apt-transport-https ca-certificates
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elasticsearch7.list
apt update
apt install elasticsearch -y

Bevor man Elasticsearch startet, sollte man unbedingt die Konfiguration anpassen, um die Größe des Heaps zu begrenzen – anderenfalls kann es passieren, dass Elasticsearch den gesamten freien Arbeitsspeicher belegt und andere Dienste beeinträchtigt werden.

Dazu habe ich in der Datei /etc/default/elasticsearch folgenden Eintrag ergänzt, um die Größe des Heap auf 4 GB festzulegen:

ES_JAVA_OPTS="-Xms4g -Xmx4g"

Hinweis dazu: der verwendete Server verfügt über 32 GB RAM. Ggf. muss man den Wert nach unten hin anpassen, wenn nicht so viel Arbeitsspeicher zur Verfügung steht. Je mehr Speicher nutzbar ist, desto effektiver kann Elasticsearch arbeiten, da dann weniger Daten im laufenden Betrieb nachgeladen werden müssen.

In manchen Anleitungen wird außerdem noch darauf hingewiesen, dass man in der Datei /etc/elasticsearch/elasticsearch.yml die IP-Adresse für eingehende Verbindungen auf 127.0.0.1 festlegen sollte. Das ist für Elasticsearch 7 allerdings nicht notwendig, da Elasticsearch ohne Angabe einer IP-Adresse ohnehin nur lokal ansprechbar ist. Zur Sicherheit sollte man die Einstellung zumindest prüfen und ggf. network.host auskommentieren oder auf 127.0.0.1 setzen:

# ---------------------------------- Network -----------------------------------
#
# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
#network.host: 192.168.0.1

Um auch den Inhalt von PDF-Dokumenten durchsuchen zu können, muss ein zusätzliches Plugin installiert werden:

/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment

Tesseract für OCR

Neben Textdokumten kann man auch Bilder nach lesbarem Text durchsuchen lassen. Dazu wird das Tool „Tesseract“ benötigt, was man wie folgt mit der Unterstützung für Deutsch und Englisch installieren kann:

apt install tesseract-ocr tesseract-ocr-deu tesseract-ocr-eng

Wichtig: OCR ist ein zeitintensiver Prozess. Wenn man sehr viele Bilder in seiner Nextcloud hat, wird der erste Aufbau des Suchindex entsprechend lange dauern!

Elasticsearch als Dienst einrichten

Nachdem alle Vorbereitungen abgeschlossen sind, kann man Elasticsearch wie folgt als Dienst aktivieren:

systemctl daemon-reload
systemctl enable elasticsearch
systemctl start elasticsearch

Der Start kann eine Weile dauern, in meinem Fall waren es etwa 20 Sekunden.

Nun steht Elasticsearch für die Volltextsuche in Textdokumenten einschließlich PDF und Office-Dokumenten wie Word und LibreOffice/OpenOffice zur Verfügung.

Einrichten der Volltextsuche in Nextcloud

Nachdem Elasticsearch und ggf. Tesseract installiert sind, installiert man in Nextcloud folgende Apps:

Sowie folgende App, wenn man Tesseract für die Textsuche in Bildern nutzen möchte:

Konfiguration der Volltextsuche

Die Konfiguration erreicht man über die Administration. Darin sind die folgenden Angaben zu ergänzen.

Im Abschnitt „Elasticsearch“

  • Addresse des Servlets: http://localhost:9200
  • Index: Name des Index, z.B. der Domainname der eigenen Nextcloud
  • Analyzer tokenizer: standard

Eine Änderung des Tokenizer ist normalerweise nicht nötig. Welche es gibt und wie diese sich verhalten, findet man in der Dokumentation bei Elasticsearch.

Im Abschnitt „Dateien“

Hier wird kann man die Aufnahme von PDF- und Office-Dokumenten in den Index aktivieren und ggf. die maximale Dateigröße anpassen, bis zur Dokumente in den Index aufgenommen werden.

Im Abschnitt „Files – Tesseract OCR“

Sofern man auch Tesseract verwendet, kann man hier OCR grundsätzlich aktivieren. Bei den Sprachen trägt man alle Sprachen ein, die man für Tesseract installiert hat, getrennt durch ein Komma – z.B. eng,deu.

Verzeichnisse aus der Suche ausschließen

Wenn man einzelne Verzeichnisse aus der Suche ausschließen möchte, kann man dazu die Datei .noindex im Verzeichnis anlegen. Siehe dazu auch https://help.nextcloud.com/t/how-to-exclude-a-folder-from-indexing/35318/2.

Aufbau des Suchindex

Der erste Aufbau des Suchindex erfolgt in einer Konsole mit folgendem Befehl im Hauptverzeichnis von Nextcloud:

php occ fulltextsearch:index

Dieser Vorgang kann je nach Umfang des vorhandenen Datenbestandes auch mehrere Stunden dauern. Wenn man per SSH auf den Server zugreift, ist es daher sinnvoll, Tools wie screen oder tmux zu verwenden, damit man das Kommando im Hintergrund laufen lassen kann, ohne die Verbindung zum Server durchgehend aufrecht erhalten zu müssen.

Aktivieren von Cron in Nextcloud

Wenn der Vorgang abgeschlossen ist, werden künftig neue Dateien oder Dateiänderungen automatisch im Rahmen des Cron-Jobs von Nextcloud in den Index aufgenommen. Dazu muss dieser aber auch über cron laufen – AJAX oder Webcron reicht dazu nicht aus!

Zur Einrichtung von Cron siehe auch die Dokumentation von Nextcloud.

Test der Suche

Nach der Einrichtung und dem Aufbau des Suchindex kann man die Suche testen, indem man das Such-Symbol in der Weboberfläche anklickt und einen Begriff eingibt, von dem man weiß, dass er in den eigenen Dokumenten vorkommt.

In der Ergebnisliste sollte dann einer oder mehrere Einträge unter „Volltextsuche“ erscheinen:

Nextcloud Volltextsuche

Im Android-Client wird die Volltextsuche dann ebenfalls unterstützt:

Nextcloud Volltextsuche in Android

PDF-Plugin bei Updates von Elasticsearch aktualisieren

Elasticsearch wird im Rahmen von regulären Updates mit apt update und apt upgrade ebenfalls aktualisiert. Dabei kann es vorkommen, dass nach dem Update der Dienst nicht mehr nutzbar ist, weil das Plugin für den PDF-Import nicht mehr zur Serverversion passt.

In diesem Fall muss man das Plugin einmal entfernen und neu installieren:

/usr/share/elasticsearch/bin/elasticsearch-plugin remove ingest-attachment
/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment

Danach kann man Elasticsearch neu starten:

systemctl restart elasticsearch

Nutzung mit Nextcloud 25

Aktuell (Stand Mitte Oktober 2022) sind die Apps für die Volltextsuche noch nicht als kompatibel zu Nextcloud 25 gekennzeichnet. Nach meiner Erfahrung funktioniert es aber problemlos, wenn man die entsprechenden Apps manuell freigibt und dann aktiviert.

4 Gedanken zu „Volltextsuche in Nextcloud einrichten“

  1. L
    Lukas

    Schöner Blogeintrag. Leider lässt sich aktuell mit der NC 25 bzw. NC Hub 3 die Volltextsuche noch nicht benutzen. Vielleicht wäre das noch eine Info wert.

    1. Arno Welzel

      Ja, dass die entsprechenden Apps für NC 25 aktuell noch nicht offiziell freigegeben sind, ist mir bekannt. Funktionieren tun sie aber trotzdem, wenn man sie manuell freischaltet und danach aktiviert.

  2. Hallo Arno,

    besten Dank für das tolle Tutorial. eine Frage bleibt bei mir noch offen:
    Welchen Eintrag (konkret) empfiehlst Du in der Crontab?

    Besten Dank aus Ostfriesland …

    Hans Gabriel

    1. Arno Welzel

      Ich verstehe die Frage nicht so ganz. Für die Volltextsuche muss man keinen speziellen Crontab-Eintrag einfügen. Die Aktualisierung erfolgt im Rahmen der regulären Job-Ausführung von Nextcloud. Siehe dazu auch: https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/background_jobs_configuration.html

Öffentlichen Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Dies ist kein Kontaktformular! Wenn Du mir eine persönliche Nachricht schreiben möchtest, benutze die E-Mail-Adresse in meinem Impressum.

Du kannst die folgenden HTML-Tags im Kommentar verwenden:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>