Teil 1: Einrichtung von Elasticsearch und FSCrawler mit Docker Compose für OCR-gestützte Dokumentenindizierung

In diesem Tutorial führen wir uns gemeinsam durch den Prozess der Einrichtung von Elasticsearch und FSCrawler mit Docker Compose. FSCrawler ist ein leistungsstarkes Tool, mit dem wir Dokumente und deren Inhalte in Elasticsearch indizieren können. Mit den OCR-Funktionen (Optical Character Recognition) von Tesseract OCR kann FSCrawler Text aus Bildern und gescannten Dokumenten extrahieren und sie in Elasticsearch durchsuchbar machen.

Voraussetzungen

Bevor wir beginnen, stellen wir sicher, dass wir Docker und Docker Compose auf unserem System installiert haben. Mit diesem Befehl können beide schnell installiert werden:

curl -fsSL https://get.docker.com | sudo sh

Schritt 1: Tesseract OCR auf dem Host-System installieren

Für Ubuntu- oder Debian-basierte Systeme führen wir die folgenden Befehle aus, um Tesseract OCR und die Sprachdaten für Englisch und Deutsch zu installieren:

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

Schritt 2: Erstellen des Projektverzeichnisses

Wir erstellen ein neues Verzeichnis für unser Projekt und navigieren dorthin:

mkdir es_fscrawler_project
cd es_fscrawler_project

Schritt 3: Erstellen der docker-compose.yml

Wir erstellen eine docker-compose.yml Datei mit dem folgenden Inhalt. Wir ersetzen your_password durch ein sicheres Passwort für die Elasticsearch-Instanz und /path/to/your/documents durch den tatsächlichen Pfad zu den Dokumenten, die FSCrawler indizieren soll.

version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.7.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms2g -Xmx2g
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=your_password
      - bootstrap.memory_lock=true
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    restart: unless-stopped

  fscrawler:
    image: dadoonet/fscrawler
    container_name: fscrawler
    depends_on:
      - elasticsearch
    volumes:
      - ~/.fscrawler:/root/.fscrawler
      - logs:/usr/share/fscrawler/logs
      - /path/to/your/documents:/tmp/es:ro
    command: ["fscrawler", "documents_job"]
    restart: unless-stopped

networks:
  es_fscrawler_network:
    driver: bridge

volumes:
  data:
    driver: local
  logs:
    driver: local

Schritt 4: Erstellen der FSCrawler-Konfigurationsdatei

Wir erstellen die FSCrawler-Konfigurationsdatei unter ~/.fscrawler/documents_job/_settings.yaml. Wir ersetzen your_password durch das gleiche Passwort, das wir für die Elasticsearch-Instanz in der Datei docker-compose.yml verwendet haben.

---
name: "documents_job"
fs:
  url: "/tmp/es"
  update_rate: "1m"
  excludes:
  - "*/~*"
  json_support: false
  filename_as_id: false
  add_filesize: true
  remove_deleted: true
  add_as_inner_object: false
  store_source: false
  index_content: true
  attributes_support: false
  raw_metadata: false
  xml_support: false
  index_folders: true
  lang_detect: false
  continue_on_error: false
  ocr:
    language: "eng+deu"
    enabled: true
    pdf_strategy: "ocr_and_text"
  follow_symlinks: false
elasticsearch:
  nodes:
  - url: "http://elasticsearch:9200"
  bulk_size: 100
  flush_interval: "5s"
  byte_size: "10mb"
  ssl_verification: true
  username: "elastic"
  password: "your_password"

Weitere mögliche Einstellungen und deren Erklärung kann man in der offiziellen Dokumentation nachlesen.

Schritt 5: Starten der Container

Wir führen den folgenden Befehl aus, um die Elasticsearch- und FSCrawler-Container zu starten:

docker compose up -d

Das -d kann man am Anfang weglassen um direkt den Output zu sehen, dies ist besonders Praktisch um Fehler direkt zu sehen.

Schritt 6: Prüfen ob die Container laufen

Wir überprüfen mit dem folgenden Befehl, ob beide Container laufen:

docker ps

Während der Startphase von Elasticsearch kann es sein, dass FSCrawler keine Verbindung zu Elasticsearch herstellen kann und sich beendet. Die Konfiguration restart: unless-stopped in der Datei docker-compose.yml stellt jedoch sicher, dass FSCrawler in diesem Fall automatisch versucht, sich neu zu starten. Sobald Elasticsearch voll funktionsfähig ist, sollte FSCrawler in der Lage sein, eine Verbindung herzustellen und wie erwartet zu funktionieren.

Schritt 7: Elasticsearch mit curl testen

Wir testen unsere Elasticsearch-Instanz mit curl, indem wir den folgenden Befehl ausführen. Das Passwort your_password muss durch das gleiche Passwort zu ersetzen, das wir zuvor verwendet haben.

Achtung: Direkt nach dem Start des Containers kann es noch einige Zeit dauern, bis Elasticsearch vollständig hochgefahren und benutzbar ist.

curl -u elastic:your_password "http://domain.example:9200"

(Anstelle von der Domain kann man auch die IP Adresse verwenden)

Schritt 8: FSCrawler testen

Wir laden eine neue Datei in das Dokumentenverzeichnis hoch und warten die angegebene Zeit für die Aktualisierungsrate ab. Anschließend suchen wir nach indizierten Dokumenten:

Wenn wir bereits Dateien in diesem Verzeichnis haben, führen wir den folgenden Befehl aus, um deren Zeitstempel zu aktualisieren und sicherzustellen, dass sie von FSCrawler aufgenommen werden:

find /path/to/your/documents -type f -exec touch {} +

Wir suchen mit curl nach indizierten Dokumenten:

curl -u elastic:your_password -XGET "http://localhost:9200/documents_job/_search?q=your_search_query&pretty"

Alternativ können wir alles hinter dem _search weglassen um alle indizierten Dateien zu bekommen.

Die Indizierung kann unter Umständen länger dauern, vor allem bei PDF-Dateien oder Bildern. Für den Anfang sollte man eine einfache .txt Datei zum testen verwenden.

Abschließender Test der API via Postman

Um das OCR zu testen haben wir hier noch eine Bilddatei hochgeladen, in dem „ADMIN INTELLIGENCE OCR TEST“ in der verbotenen Schrift geschrieben wurde. Auch dies wurde ohne Probleme von Tesseract/FSCrawler identifiziert und in Elasticsearch indiziert.

Fazit

Nachdem wir einige Zeit investiert und uns durch den komplexen Konfigurationsprozess gekämpft haben, ist es uns gelungen, Elasticsearch und FSCrawler mit Docker Compose erfolgreich einzurichten. Obwohl die Konfiguration anfangs ein Albtraum war, funktioniert das System nun einwandfrei und bietet uns leistungsstarke OCR-Funktionen zur Indizierung und Durchsuchung unserer Dokumente.

Als nächsten Schritt und auch als Thema für unseren nächsten Blogbeitrag planen wir, das gesamte System in ein Laravel-Projekt zu integrieren. Dadurch können wir die Vorteile von Elasticsearch und FSCrawler nahtlos in unsere Laravel-Anwendungen einbinden und ein umfassendes, OCR-gestütztes Dokumentensuchsystem bereitstellen.

Teil 2: Elasticsearch und FSCrawler in Laravel

Sollten Sie noch Fragen haben oder eine Beratung wünschen, können Sie gerne mit uns Kontakt aufnehmen oder unsere Webseite besuchen. Wir lassen Ihnen gerne ein unverbindliches Angebot zukommen.