17 Such-APIs

17.1 Einführung in die Suche mit OpenSearch

Die Suchfunktionalität ist das Herzstück von OpenSearch. Während die Dokumenten-APIs uns ermöglichen, Daten zu speichern und zu verwalten, sind es die Such-APIs, die OpenSearch zu einem mächtigen Analyse- und Recherchewerkzeug machen. In diesem Kapitel lernen wir, wie wir von einfachen Suchanfragen bis hin zu komplexen Analysen das volle Potenzial der Such-APIs ausschöpfen können.

17.2 Die Grundlagen der Suche

17.2.1 Die Endpunkte verstehen

OpenSearch bietet vier zentrale Endpunkte für die Suche:

GET /<index>/_search    # Suche in einem spezifischen Index
GET /_search           # Suche über alle Indizes
POST /<index>/_search  # Suche mit Request-Body in spezifischem Index
POST /_search         # Suche mit Request-Body über alle Indizes

Die Wahl zwischen GET und POST hängt hauptsächlich von der Komplexität Ihrer Suchanfrage ab. Bei einfachen Suchen reicht GET, für komplexere Anfragen mit umfangreichem Request-Body ist POST die bessere Wahl.

17.2.2 Die wichtigsten Suchparameter

OpenSearch bietet eine Vielzahl von Parametern, um die Suche zu steuern. Hier sind die wichtigsten:

  1. size: Kontrolliert die Anzahl der zurückgegebenen Dokumente

    GET /mein-index/_search?size=5
  2. from: Ermöglicht Pagination durch Überspringen von Ergebnissen

    GET /mein-index/_search?from=10&size=5
  3. timeout: Begrenzt die Suchzeit

    GET /mein-index/_search?timeout=1s
  4. search_type: Beeinflusst die Art der Suche

17.2.3 Echtzeitsuche und Performance

Die Parameter realtime und refresh spielen eine wichtige Rolle für die Balance zwischen Aktualität und Performance:

# Echtzeitsuche (kann Performance beeinträchtigen)
GET /mein-index/_search?realtime=true

# Suche nach dem letzten Refresh (bessere Performance)
GET /mein-index/_search?realtime=false

17.3 Fortgeschrittene Suchtechniken

17.3.1 Query DSL verstehen und nutzen

Die Query DSL (Domain Specific Language) ist das mächtigste Werkzeug für komplexe Suchen:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "titel": "OpenSearch" }},
        { "range": { "datum": { "gte": "2024-01-01" }}}
      ],
      "must_not": [
        { "term": { "status": "entwurf" }}
      ],
      "filter": [
        { "term": { "kategorie": "technologie" }}
      ]
    }
  }
}

17.3.2 Suchpräferenzen und Routing optimieren

Die Suchperformance kann durch geschicktes Routing und Präferenzen optimiert werden:

# Suche auf bestimmten Shards
GET /mein-index/_search?preference=_shards:0,1

# Lokale Ausführung bevorzugen
GET /mein-index/_search?preference=_local

# Suche auf Primary Shards
GET /mein-index/_search?preference=_primary

17.3.3 Fehlerbehandlung und Teilresultate

OpenSearch bietet verschiedene Möglichkeiten, mit Fehlern und Teilresultaten umzugehen:

# Teilresultate erlauben
GET /mein-index/_search?allow_partial_search_results=true

# Fehlertolerante Suche
GET /mein-index/_search?lenient=true

17.4 Aggregationen und Analysen

17.4.1 Grundlegende Aggregationen

{
  "size": 0,
  "aggs": {
    "kategorien": {
      "terms": {
        "field": "kategorie",
        "size": 10
      }
    },
    "durchschnittspreis": {
      "avg": {
        "field": "preis"
      }
    }
  }
}

17.4.2 Verschachtelte Aggregationen

{
  "aggs": {
    "nach_kategorie": {
      "terms": {
        "field": "kategorie"
      },
      "aggs": {
        "preis_stats": {
          "stats": {
            "field": "preis"
          }
        }
      }
    }
  }
}

17.5 Optimierung und Best Practices

17.5.1 Performance-Optimierung

  1. Batch-Size optimieren:

    {
      "size": 100,
      "query": {...},
      "batched_reduce_size": 512
    }
  2. Source-Filtering nutzen:

    {
      "_source": ["titel", "autor"],
      "query": {...}
    }
  3. Pre-Filter für große Indizes:

    {
      "pre_filter_shard_size": 128,
      "query": {...}
    }

17.5.2 Fehlerbehandlung

{
  "track_total_hits": true,
  "track_scores": true,
  "explain": true,
  "query": {...}
}

17.6 Konkrete Anwendungsbeispiele

17.6.1 Volltextsuche mit Relevanz

{
  "query": {
    "multi_match": {
      "query": "OpenSearch Suche",
      "fields": ["titel^2", "beschreibung"],
      "type": "best_fields",
      "tie_breaker": 0.3
    }
  }
}

17.6.2 Facettierte Suche für E-Commerce

{
  "query": {
    "match": {
      "kategorie": "elektronik"
    }
  },
  "aggs": {
    "preis_bereiche": {
      "range": {
        "field": "preis",
        "ranges": [
          { "to": 50 },
          { "from": 50, "to": 200 },
          { "from": 200 }
        ]
      }
    },
    "marken": {
      "terms": {
        "field": "marke",
        "size": 10
      }
    }
  }
}

17.6.3 Autocomplete und Suggest

{
  "suggest": {
    "text": "opensear",
    "completion": {
      "field": "suggest",
      "fuzzy": {
        "fuzziness": 2
      }
    }
  }
}

17.7 Debugging und Troubleshooting

17.7.1 Explain API nutzen

{
  "explain": true,
  "query": {
    "match": {
      "titel": "OpenSearch"
    }
  }
}

17.7.2 Profile API für Performance-Analyse

{
  "profile": true,
  "query": {
    "match_all": {}
  }
}

17.8 Erweiterte Konzepte

17.8.1 Search After für tiefes Paging

{
  "size": 10,
  "query": {...},
  "search_after": [1579238451, "654321"],
  "sort": [
    {"datum": "desc"},
    {"_id": "desc"}
  ]
}

17.8.2 Scroll API für große Datenmengen

{
  "size": 100,
  "query": {...},
  "sort": ["_doc"],
  "scroll": "1m"
}

17.9 Best Practices und Empfehlungen

  1. Immer mit spezifischen Indizes arbeiten
  2. Performance-Optimierung
  3. Fehlerbehandlung

17.10 Zusammenfassung und Ausblick

Die Such-APIs von OpenSearch bieten ein mächtiges Werkzeug für die Datensuche und -analyse. Von einfachen Textsuchen bis hin zu komplexen Aggregationen ermöglichen sie eine flexible und skalierbare Implementierung von Suchfunktionen.

Wichtige Aspekte für den produktiven Einsatz sind:

Mit diesem Wissen können Sie die Such-APIs effektiv in Ihren Anwendungen einsetzen und das volle Potenzial von OpenSearch ausschöpfen.