Elasticsearch im Einsatz bei unseren Kunden
Exensio setzt seit ca. einem Jahr Elasticsearch als Suchlösung für seine Kunden ein. Einer der Kunden wünschte sich eine Volltextsuche über seine Produktdatenbank. Bei dieser Produktdatenbank handelt es sich um ca. 15 Datenbanktabellen mit einem Datenvolumen von ca. 10 GB. Eine Tabelle beinhaltet Dateien. Diese sind hauptsächlich Office-Dateien, Pdfs oder Bilder. Über Fremdschlüssel sind sie mit anderen Tabellen verknüpft. Da sich die Produktdatenbank und der Suchserver in verschiedenen Zonen befinden und nicht direkt miteinander kommunizieren können, wurde eine tägliche Indizierung und Bereitstellung der Inhalte umgesetzt. Dies ermöglichte eine Umsetzung mit Elasticsearch unter der Verwendung von „Nested Objects“ [1]. „Nested Objects“ wurden auch schon als das Beste nach geschnittenem Brot aufgefasst [2]. Obwohl dies eine wahrlich gewagte These ist, kann ich diese nicht widerlegen. „Nested Objects“ können, wie geschnittenes Brot ein Genuss in jeglicher Hinsicht sein.
Bei einem weiteren Kunden musste gewährleistet werden, dass der Index immer aktuell ist. Immer aktuell bedeutet in diesem Kontext, dass es höchstens eine Verzögerung von ca. zehn Sekunden geben soll, nachdem ein Objekt bearbeitet wurde. Insgesamt mussten ca. 2500 Studien mit ca. 9500 Dateien indiziert werden. Teilweise mehr als 200 Dateien (Pdfs und Office-Dateien) sind einer Studie zugeordnet. Eine einzelne Datei an einer Studie kann über 200 MB groß sein. Wir entschieden, dass ein „Nested Object“ in diesem Fall nicht unseren Anforderungen entspricht. Ein einzelnes „Root Object“ mit allen Metadaten und den extrahierten Texten der Dateien ist hier unter Beachtung der zeitlichen Anforderungen nicht einfach umsetzbar, da prinzipiell das komplette „Nested Object“ mit all seinen 200 Dateien neu indiziert werden müsste, sobald sich ein einzelnes Attribut an einer Studie ändert. Ein erneutes Indizieren der Studie mit allen dazugehörenden Dateien würde hierfür zu lange brauchen. Unter Verwendung der „Update API“ von Elasticsearch könnte man dies besser lösen. Dies erfordert jedoch einen erheblichen Mehraufwand, kann erhebliche Ressourcen(Speicher, CPU) verbrauchen und ist nicht feingranular, da ein UPDATE intern aus einem Auslesen, Update und Schreiben des Objekts (Studie + Dateien) besteht.