Nextcloud - Installation und Konfiguration von Elasticsearch

In diesem Beitrag wird die Volltextsuche in die eigene Nextcloud Instanz integriert und eingerichtet.

Nextcloud - Installation und Konfiguration von Elasticsearch

Inhalt:


Vorwort

Da die eingebaute Suche innerhalb Nextcloud nur mäßig funktioniert und zusätzlich nur den Dateinamen erfasst, soll heute zusätzlich ein Elasticsearch Knoten aufgebaut werden. Mit Hilfe von Elasticsearch lassen sich anschließend auch Dateiinhalte von PDF Dokumenten durchsuchen. Im Anschluss daran werde ich noch auf die Einbindung innerhalb der Nextcloud eingehen und die Konfiguration der dazu notwendigen Plugins.


Installation

Vor Beginn der Installation sollten alle Pakete auf dem System auf den neuesten Stand gebracht werden - um Seiteneffekten vorzubeugen wie der Aktualisierung des Webservers:

sudo apt update && sudo apt upgrade -y

Danach kann Java nachinstalliert werden, welches die Basis für die Suchengine darstellt.

Vorbereitungen

sudo apt install apt-transport-https ca-certificates 
sudo apt install openjdk-8-jre

Elasticsearch

Da Elasticsearch nicht in den Standard Paketquellen enthalten ist, muss zuerst der GPG Key hinzugefügt werden, anschließend ein entsprechender Eintrag in den Paket Quellen.

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

Jetzt kann Elasticsearch über den APT Paketmanager bezogen und installiert werden:

sudo apt update && sudo apt install elasticsearch

Im Anschluss daran muss der Dienst noch gestartet werden, ebenso soll der Autostart konfiguriert werden:

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

Konfiguration

Da Elasticsearch ein enorm starkes Werkzeug sein kann, sollte das Programm nur lokal (auf der Nextcloud Instanz) angesprochen werden können. Durch die Anpassung der Elasticsearch Config lässt sich dieses Verhalten realisieren:

sudo nano /etc/elasticsearch/elasticsearch.yml

Innerhalb der Konfigurationsdatei sollten diese beiden Parameter durch Entfernen der # aktiviert werden:

bootstrap.memory_lock: true
[...]
network.host: 127.0.0.1

Im letzten Parameter muss zusätzlich noch die IP Adresse auf den localhost umgebogen werden.

Um den belegten Arbeitsspeicher zu beschränken, wird im Anschluss noch die obere Schranke des maximal zu belegenden RAM definiert:

nano /etc/init.d/elasticsearch
# Maximum amount of locked memory
MAX_LOCKED_MEMORY=4096

Zuletzt wird noch ein Plugin nachinstalliert um auch PDF Dateien zuverlässig durchsuchen zu können:

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

Um die Änderungen wirksam zu machen, wird Elasticsearch anschließend noch neu gestartet:

sudo systemctl restart elasticsearch

Anlegen des Index

Damit uns Elasticsearch zuverlässig mit Informationen versorgen kann, muss initial ein Index per Hand aufgebaut werden, im Anschluss daran wird dieser mit jedem weiteren Aufruf des Cronjobs aktualisiert.

sudo -u www-data php /var/www/nextcloud/occ fulltextsearch:index

Anbindung an die Nextcloud

Um die jetzt enstandene Suchmaschine auch innerhalb der Nextcloud einsetzen zu können, werden 3 Apps benötigt, alle sind über den normalen Appstore von Nextcloud zu beziehen:

  • Full Text Search
  • Full Text Search - Elasticsearch Platform
  • Full Text Search - Files
Die 3 benötigten Apps zum Betrieb von Elasticsearch
Die 3 benötigten Apps zum Betrieb von Elasticsearch

Nach der Installation muss ins Dashboard gewechselt werden, dort finden wir einen neuen Punkt mit Namen Volltextsuche, dort sind folgende Einstellungen zu tätigen:

Volltextsuche Einstellungen Part #1
Volltextsuche Einstellungen Part #1

"Volltextsuche Einstellungen Part #2"

Optional: Tesseract zur Texterkennung innerhalb von Bildern

Sollen auch Bilder indexiert werden, lässt sich hierbei Tesseract OCR (= Optical Character Recognition = Zeichenerkennung) einbinden. Tesseract OCR soll bei mir deutsche, sowie englische Sprache identifizieren, da die meiste Fachliteratur bei mir nur in englischer Sprache vorliegt. Soll bei euch lediglich deutsch abgeglichen werden, lasst das entsprechende Paket einfach weg:

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

Zusätzliche Sprachen lassen sich auch im entsprechenden Github Repo finden - können bei Bedarf also problemlos zusätzlich installiert werden. Anschließend muss - wie schon bei Elasticsearch - eine App nachinstalliert werden:

Ebenso erscheint ein weiterer Unterpunkt im Menu der Volltextsuche (s.o.) dort muss lediglich Tesseract aktiviert werden, sowie die zu prüfenden Sprachen (hier: deu,eng) angegeben werden. Die Page Segmentation Sektion empfehle ich auf Default 4 zu belassen, im konkreten Falle lohnt es sich im Wiki nachzulesen, bei mir hat sich außer erhöhter Load, kein Ergebnis feststellen lassen.


Suchsyntax

Die Syntax von Elasticsearch unterscheidet sich wenig von der bekannter Suchmaschinen wie Google. Dennoch könnte es von Interesse sein, daher hier ein kleiner Auszug:

  • Suchergebnis "Internet" Findet alle Dateien, die „Internet“ im Pfad- oder Dateinamen oder auch als Inhalt haben.
  • Inter* Mithilfe des Asterisk findet man alle Dateien die "Inter" und beliebig viele weitere Zeichen (hierfür der Asterisk *) im Dateinamen, Pfadnamen oder Inhalt beherbergen.
  • Internet Neuland Deutschland Findet alle Dateien, die mindestens einen der drei Begriffe im Datei- oder Verzeichnisnamen, oder Inhalt haben.
  • +Internet Neuland Deutschland Findet alle Dateien, die auf jeden Fall „Internet“ und vielleicht „Neuland“ oder „Deutschland“ im Pfad- oder Filenamen oder als Inhalt haben.
  • Internet in:filename Findet alle Dateien, die „Internet“ im Pfad oder Dateinamen enthalten, beschränkt die Ausgabe hierbei aber leidglich auf Ergebnisse in Pfad- oder Dateinamen, nicht aber auf Inhalte.
  • Internet in:content Findet Dateien, die „Internet“ als Inhalt haben.

Bekannte Probleme / Troubleshooting

Elasticsearch startet nach Update/Reboot nicht mehr

Besonders nach Update der Pakete für Elasticsearch oder Tesseract kam es bei mir vor, dass sich die Suchengine nicht mehr starten ließ. Abhilfe schaffte die Neuinstallation des Plugins:

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

Anschließend liess sich Elasticsearch wie gewohnt starten:

sudo systemctl start elasticsearch