ElasticSearch Installieren - Schritt für Schritt Anleitung

Elasticsearch ist die Suchmaschine für den anspruchsvollen Nutzer und jeden halbwegs professionellen Online-Shop. Sie basiert auf Lucene. Elasticsearch ist in Java geschrieben, blitzschnell und dank dem JSON-Format sehr einfach zu bedienen. Die Einrichtung selbst und die Grundkonfiguration ist nicht ganz so banal und hat mich viel Zeit für Recherche und Testen gekostet.

Um den Einstieg anderen zu erleichtern, gibt es diese 2-teile Blogreihe in der ich erkläre, wie man Elasticsearch installiert und für eine kleine bis mittelgroße Seite einrichtet.

Elasticsearch

Vorraussetzung / Vorbereitung

Elasticsearch lässt sich nicht (oder nur sehr umständlich) auf einem einfachen Webspace installieren. Diese Anleitung geht davon aus, dass Du einen eigenen Server (z.B. CloudServer) nutzt und Root Rechte hast.

  • Server 1 mit Ubuntu 16.04 (z.B. CloudServer von Hetzner oder AmazonAWS)
  • Server 2: Ein Webspace/Server auf dem eure Webseite läuft (brauchen wir im 2ten Teil)
  • Root Zugriff auf Server 1
  • Firewall auf Server 1
  • Java 8 auf Server 1 (s. unten)
  • Putty (Link) oder einen anderen SSH Client
  • REST Client (z.B. Advanced REST Client) zum Test der Verbindung

Sobald Du alle Vorbereitungen getroffen hast, kannst Du loslegen.

Java 8 auf Ubuntu installieren

Falls Du bereits Java 8 installiert hast, kannst Du diesen Schritt überspringen. Ansonsten installieren wir das Oracle JDK 8 mit folgenden Befehlen:

sudo apt-get update
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

Elasticsearch mit APT-Get installieren

Das ist relativ simple und keine Zauberei. Meine Anleitung bezieht sich auf die Version 6 von Elasticsearch. Falls es eine neuere Version gibt, sollte die Vorgehensweise identisch sein, lediglich statt 6. dann 7. (oder halt die neue Version) verwenden. Mehr Infos findest Du hier: Elasticserach mit Debian Package.

Du öffnest Putty bzw. den SSH Client Deiner Wahl, gibst die Zugangsdaten zum Server ein; die Konsole sollte sich öffnen.

Elasticsearch PGP Key importieren

Damit wir Elasticserach problemlos über apt-get installieren können, fügen wir den PGP Key hinzu:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

APT Repository installieren

Als nächstes installieren wir apt-transport-https:

sudo apt-get install apt-transport-https

...und wir speichern die Definition des Repositorys unter dem Pfad /etc/apt/sources.list.d/elastic-6.x.list:

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

Wichtiger Hinweis: Elasticsearch empfiehlt diese Vorgehensweise zu verwenden und nicht add-apt-repository.

Mit folgendem Befehl wird Elasticsearch mit allen zugehörigen Komponenten installiert:

sudo apt-get update && sudo apt-get install elasticsearch

Damit Elasticsearch automatisch mit dem Server startet fügen wir dieses Init-Script dem Runlevel hinzu:

sudo systemctl enable elasticsearch.service

Grundeinstellungen von Elasticsearch

Bevor wir Elasticsearch starten, legen wir noch ein paar Grundeinstellungen fest. Die meisten Einstellungen werden in der Datei elasticsearch.yml gespeichert. Wir öffnen also diese Datei und passen sie für uns an:

sudo nano /etc/elasticsearch/elasticsearch.yml

Wir suchen die folgenden Zeilen und ändern die Werte entsprechend ab. Ggf. vorher die Raute (#) entfernen:

cluster.name: MeinCluster
node.name: "Mein erster Node"
network.host: 0.0.0.0

Die Namen kannst Du frei vergeben. Die IP-Adresse 0.0.0.0 heißt, dass man von überall darauf zugreifen kann. Das ist natürlich kritisch, sichern wir aber im Verlauf noch ab. Mit Strg + X Datei speichern und schließen. Wir können Elasticsearch jetzt starten und schauen, ob eine Fehlermeldung kommt:

sudo systemctl start elasticsearch

Der erste Start kann etwas dauern. Glückwunsch! :)

Elasticsearch absichern

Je nachdem für was Du Elasticsearch verwendest, spielt die Sicherheit eine mehr oder weniger große Rolle. Die folgenden Einstellungen sind auf jeden Fall lohnenswert und sichern schon einmal ganz gut ab. Wer mit hochsensiblen Daten arbeitet, sollte seine Sicherheitsvorkehrungen auf jeden Fall verstärken und sich Unterstützung von einem Experten holen.

Firewall Port freigeben - Exkurs UFW

Ich gehe davon aus, dass Du eine Firewall einsetzt. Falls nicht, solltest Du das zwingend tun! Ich verwende UFW (Uncomplicated Firewall) von Ubuntu. Die ist simpel zu bedienen und läuft ohne Probleme. Falls Du noch keine Firewall einsetzt machst Du das so:

sudo apt-get install ufw

Wir geben jetzt den Port 22 von jeder IP Adresse frei. Ab dann kannst Du nur noch über SSH auf den Server zugreifen:

sudo ufw allow 22
#oder
sufo ufw allow OpenSSH

Bis hierhin solltest Du Deine Server grundsätzlich so konfiguriert haben.

Firewall (UFW) starten / neustarten

Die folgenden Befehle starten, beenden und neustarten die Firewall:

sudo ufw enable
sudo ufw disable
sudo service ufw restart

So, Elasticsearch läuft auf Port 9200. Wir geben also Port 9200 frei, so dass nur die IP-Adresse von Server 2 (= der Webserver) darauf zugreifen darf. Zu Testzwecken geben wir vorerst auch unsere eigene IP frei, damit wir vom lokalen PC aus darauf zugreifen können:

sudo ufw allow from SERVER2IP to any port 9200 # SERVER2IP mit der IP des Webserservers austauschen
sudo ufw allow from LOKALEIP to any port 9200 # LOKALEIP mit der IP eures PCs austauschen

Falls Du später von mehreren Servern auf Elasticsearch zugreifen möchtest, kannst Du die Ports entsprechend freigeben.

Firewall (UFW) Status anzeigen

Sobald die Ports freigegeben sind, starten wir die Firewall oder falls sie bei Dir schon läuft, starte die Firewall neu (Befehle siehe oben). Mit folgendem Befehl prüfen wir, welche Ports offen sind:

sudo ufw status

Wenn alles geklappt hat, solltest Du in etwa folgendes angezeigt bekommen:

Status: active

To                         Action      From
--                         ------      ----
9200                       ALLOW       SERVER2IP
9200 ALLOW LOKALEIP 22 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6)

Das war es ansich auch schon. In der Datei elasticsearch.yml kannst Du bei network.host noch die IP spezifizieren, das ist aber nicht mehr zwingend notwendig.

Erste Abfrage mit Elasticsearch 

Bevor wir eine erste Abfrage machen, starten wir Elasticsearch nochmal neu, das geht so:

sudo systemctl restart elasticsearch

Jetzt brauchen wir den REST-Client. Den öffnest Du und wählst bei Methode GET aus und trägst folgendes ein:

http://IPSERVER1:9200/?pretty

IPSERVER1 ersetzt Du natürlich durch die IP des Server 1 (also der, auf dem Du Elasticsearch installiert hast). Klicke auf SEND. Wenn Du alles richtig gemacht hast, sollte eine Erfolgsmeldung ("200 OK") zurückkommen. Falls er z.B. ewig lädt, stimmt etwas mit der Firewall nicht oder Elasticsearch ist nicht gestartet. Eine erfolgreiche Abfrage schaut in etwa so aus:

Elasticsearch REST-API

Wenn das bei Dir so ähnlich ausschaut, hat alles geklappt, sehr schön :)

Elasticsearch Daten speichern

Um Elasticsearch aktiv nutzen zu können, ist es natürlich wichtig auch die Daten dort zu speichern. Wir machen das später automatisiert im JSON-Format. Zum Testen der Verbindung und um sich mit der Schnittstelle vertraut zu machen, kannst und solltest Du das über den REST-Client testen.

Du speicherst also zuerst eine Nachricht in einem bestimmten Index von einem bestimmten Typ mit einer festgelegten ID. Als URL gibst Du dazu folgendes ein:

http://IPSERVER1:9200/glohbe/nachrichten/1

Bei Method wählst Du POST. Darauf hin erscheint ein neues Feld mit Body dort trägst Du folgendes ein:

{
"nachricht": "Meine erste Nachricht an Elasticsearch!"
}

Kurz zu den einzelnen Teilen:

  • glohbe: Das ist der Index des Datensatzes in Elasticsearch. Das könnte später z.B. der Seitennamen sein
  • nachrichten: Das ist der Type. Das könnte sowas wie Produkt, Blogpost, etc. sein
  • 1: Das ist die ID. Wir legen die in diesem Beispiel fest. Im tatsächlichen Betrieb passiert das automatisch
  • nachricht: Das ist quasi die Spalte mit dem Inhalt "Meine erste ..."

Darauf klickst Du auf SEND. Das sollte dann so ausschauen:

Elasticsearch Daten speichern

Steht dann "201 created" da, haben wir erfolgreich etwas gespeichert. Speicherst Du etwas neues mit der gleichen ID, wird der vorige Eintrag überschrieben.

Elasticsearch Daten abfragen

Die Abfrage funktioniert genauso simpel. Wir ändern die Methode wieder auf GET, die URL können wir genauso lassen wie beim Speichern. Klicken wir auf SEND sollte die Antwort in etwa so sein:

{
      "_index": "glohbe",
      "_type": "nachrichten",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
            "nachricht": "Meine erste Nachricht an Elasticsearch!"
      }
}

Suche mit Elasticsearch

Natürlich wollen wir später nach etwas suchen und nicht einfach die ID eingeben. Elasticsearch ist ja schließlich eine Suchmaschine. Speichere noch ein paar weitere Nachrichten, ähnlich wie oben. Gebe z.B. auch zwei Felder ein, so dass Du beispielsweise noch eine Person hast, die die Nachricht geschickt hat:

{
"nachricht": "Wow, der Blog ist voll super!",
"vorname": "Jeder",
"nachname": "Leser"
}

Hast du ein paar Einträge gemacht, können wir mit Suchen beginnen. 

Einträge eines Types "finden"

Die Befehle sind wie gesagt, sehr einfach aufgebaut und intuitiv. Wollen wir z.B. alle Einträge anzeigen, die in "nachrichten" sind, nehmen wir als Method "GET" und ändern die URL in http://IPSERVER1:9200/glohbe/nachrichten/_search?pretty. Wir erhalten dann einen übersichtliche, schön formatierte Antwort. Die schaut dann z.B. so aus:

{
"took":1,
"timed_out":false,
"_shards":{
     "total":5,
     "successful":5,
     "skipped":0,
     "failed":0
},
"hits":{
     "total":2,
     "max_score":1.0,
     "hits":[{
          "_index":"glohbe",
          "_type":"nachrichten",
          "_id":"1",
          "_score":1.0,
          "_source":{
               "nachricht": "Meine erste Nachricht an Elasticsearch!"
          }
       },{
       "_index":"glohbe",
       "_type":"nachrichten",
       "_id":"y91lGmIBi976OSGR8F2j", # Das war eine automatisch generierte ID
       "_score":1.0,
       "_source":{
           "nachricht": "Wow, der Blog ist voll super!",
            "vorname": "Jeder",
            "nachname": "Leser"
       }
   }]
}}

Wollen wir die Nachrichten in denen "Jeder" vorkommt, hängen wir an die URL "&q=Jeder". Das gibt aber auch Einträge zurück in denen in Nachricht "Jeder" vorkommt. Möchten wir explizit in Vorname nach "Jeder" suchen schaut die URL so aus:

http://IPSERVER1:9200/glohbe/nachrichten/_search?pretty&q=vorname:jeder
### Die Antwort:
{ "took": 4, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.2876821, "hits": [{ "_index": "glohbe", "_type": "nachrichten", "_id": "y91lGmIBi976OSGR8F2j", "_score": 0.2876821, "_source": { "nachricht": "Wow, der Blog ist voll super!", "vorname": "Jeder", "nachname": "Leser" } }], } }

Damit kannst Du ein bisschen rumspielen. Die Dokumentation von Elasticsearch ist da auch sehr hilfreich!

Bevor Du Schluss machst, solltest Du die IP von deinem lokalen Rechner wieder in der Firewall sperren, damit da kein Unfug getrieben werden kann:

sudo ufw deny from LOKALEIP to any port 9200

Im nächsten Teil verbinden wir Elasticsearch mit unserem Shop/Blog und ermöglichen Suchen auch mit Schreibfehlern, etc.

Bis dahin
Hansi

Weitere Artikel:

2018-elasticsearch-teil-2.jpg

Elasticsearch mit PHP

Im 2ten Teil der ElastSearch-Reihe zeige ich, wie ihr mit PHP von eurer Webseite aus auf ElasticSearch zugreifen könnt. Dabei erkläre ich die Suche, wie man Tippfehler berücksichtigt und was man noch so machen könnte.

kanada-roadtrip.jpg

Yukon - Freiheit in endloser Weite

4 Tage Kanu fahren, 8 Tage Roadtrip, 2 Tage in den Bergen wandern. Der Reisebericht über unseren Kanada-Urlaub! Auch wenn wir nur 12 Tage dort waren, die Reise hat sich definitiv gelohnt und ist sehr empfehlenswert.

0 Kommentare

Kommentar verfassen
Ersten Kommentar abgeben
Name:
E-Mail
Bewertung Qualätit:
Bewertung Lesbarkeit:
Bewertung Inhalt:
Überschrift:
Kommentar:
www.godlike.de

Diese Webseite verwendet Cookies, damit wir die Inhalte und Funktionen der Webseite optimal gestalten können. Durch die weitere Nutzung der Webseite stimmen Sie der Nutzung von Cookies zu.