Elasticsearch: Bulk Upload

Nachdem ich meine ersten Geh- (Stolper)versuche mit Elasticsearch bestanden habe wolle ich im nächsten Schritt meinen Index mit für mich relevanten Daten füllen. Diese Daten sollen dann die Basis für meine ersten Erfahrungen mit sinnvollen Suchanfragen bilden.

Dieser Bulkupload soll später durch einen individuellen Upload einzelner Dokumente ersetzt werden um Bandbreiten zu sparen. Im Verlauf dieser Übung habe ich auch festgestellt das man mit so einem Upload auch schnell alle Probleme findet die sich ergeben wenn man umfangreichere Texte in einen Index überführen möchte.

Leider reicht dieser Beitrag doch nicht komplett. Das JSON File das hier erzeugt wird ist nicht für einen Bulkupload geeignet.

Hier das Template das ich verwendet habe und mit dem ich nach etwas probieren alle Beiträge in den Index hoch laden konnte.

---
layout: none
---
{% for post in site.posts %}
        {% if post.draft != true %}
{"index":{"_index":"blog2", "_type" : "post" , "_id": "{{ post.date | date: "%y%m%d%k%M"}}"}}\n
{"title": "{{ post.title | escape  }}", "url": "{{ site.url }}{{ post.url }}", "tags": "{% for tag in post.tags %}{{ tag }};{% endfor %}", "content": "{{ post.content | strip_html | strip_newlines | remove:  "   " | remove: "\" | escape  }}"}
        {% endif %}
{% endfor %}

Als _postid verwende ich einfach das Datum mit der Uhrzeit. Das ist mit Sicherheit nicht für alle Szenarien ausreichend aber für meinen Blog wird es wohl reichen. Die Filter für den Titel und den Content sind notwendig da ich an vielen Stellen Hochkommas in den Texten verwende die den Import stören. Wichtig ist auch das alles in einer Zeile steht. Sonst bekommt man beim Import eine Fehlermeldung die einen auf eine falsche Fährte führt.

Der Upload geht dann so

 curl -XPOST 'https://username:passwort@try1-yourserver.eu-west-1.bonsai.io/_bulk'  --data-binary @_site/search.json

Als Ergebnis bekommt man dann die Fehlermeldungen bei denen der Import nicht geklappt hat. In meinem Fall musste ich etwas Zeit in die Filter für den Content investieren bis ich alle Sonderzeichen und unzulässigen Escapesequenzen heraus gefiltert hatte.

Irgendwann beginnt dann das Ergebnis mit

{"took":386,"errors":false,"items":[{

Dann hat man alle Fehler eliminiert und der Index ist mit allen Dokumenten des Jekyll Blogs gefüllt.