Index mit IndexTemplate erzeugen

Das Erstellen eines Index mit Hilfe eines Templates ist trivial, so dass es kaum einen Artikel dafür braucht

Im vorherigen Blog-Artikel wurde nun ein Index-Template mit dem Namen “standard” angelegt. Das Namens-Matching ist "*". Damit wird das Template für alle neuen Indexe verwendet, da ja jeder Name auf * matched.

Zur Vorbereitung eines weiteren Artikels, habe ich ein Script erstellt, dass gleich zwei identische Indexe anlegt. Diese werden benötigt, um später Mastodon Accounts in OpenSearch zu laden.

Account Schema-Objekte kennen wir schon aus Mastodon-Status-Nachrichten, wo sie bereits eingebettet sind. Das Mapping ist etwas einfacher. Aber es wird dramatisch übersichtlicher, weil wir schon was in das Index-Template verschoben haben: die Index-Settings mit dem HTML Analyzer.

Somit ist das Script osCreateFollowersIndexes.py wirklich trivial:

from opensearchpy import OpenSearch


def login (host, port):
    # Client zu dem Dev Cluster (ohne SSL, ohne Anmeldung)
    return OpenSearch(
        hosts = [{'host': host, 'port': port}],
        http_compress = True, # enables gzip compression for request bodies
        use_ssl = False
    )


# Namen der Indexe
index_names = ['followers', 'following']

# Die Einstellungen
index_body = {
    "mappings": {
        "properties": {
            "id": {"type": "keyword"},
            "created_at": {"type": "date"},
            "last_status_at": {"type": "date"},
            "language": { "type": "keyword" },
            "url": { "type": "keyword" },
            "followers_count": {"type": "long"},
            "following_count": {"type": "long"},
            "statuses_count": {"type": "long"},
            "note": {
                "type": "text",
                "analyzer": "my_html_analyzer"
            },
            "source": {
                "type": "nested",
                "properties": {
                    "privacy": {"type": "keyword"},
                    "language": {"type": "keyword"}
                }
            }
        }
    }
}

client = login("localhost", 9200)

for index_name in index_names:
    if not client.indices.exists(index_name):
        response = client.indices.create(index_name, body=index_body)
        print(f'Index "{index_name}" erstellt: {response}')

Das Mapping ist einfach gehalten. note ist der Profiltext und i.d.R. mit HTML verseucht. Daran hängt der eigene Analyzer. Da Folgende und Gefolgte strukturell identisch sind, gibt es eine kleine Schleife.

Durch das Templating müssen wir uns weder um die Definition des Analyzer kümmern, noch individuell die Deklaration der Shards und Replications festlegen. Damit kann dieses Script in Dev- oder Prod-Umgebungen angewendet werden.