Elasticsearch-Client für TypeScript: @elastic/elasticsearch

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Elasticsearch-Client für TypeScript (@elastic/elasticsearch)

\n\n

In der modernen Webentwicklung sind Volltextsuche und Datenanalyse zu einem wesentlichen Bestandteil vieler Anwendungen geworden. Elasticsearch ist ein leistungsstarkes, verteiltes Suchsystem, das auf Apache Lucene basiert. Für die Arbeit damit aus TypeScript-Anwendungen (sowohl auf dem Node.js-Server als auch im Browser) wird der offizielle Client @elastic/elasticsearch verwendet. In diesem Artikel werden wir seine Installation, Konfiguration und die wichtigsten Funktionen im Detail behandeln.

\n\n

Was ist @elastic/elasticsearch?

\n\n

@elastic/elasticsearch ist der offizielle, leistungsstarke Client für Elasticsearch, geschrieben in TypeScript. Er bietet eine vollständige API für die Interaktion mit einem Elasticsearch-Cluster, einschließlich:

\n\n
    \n
  • Indizierung und Löschung von Dokumenten
  • \n
  • Volltextsuche mit Unterstützung für komplexe Abfragen
  • \n
  • Aggregationen zur Datenanalyse (Gruppierung, Statistik)
  • \n
  • Verwaltung von Indizes und Mapping
  • \n
  • Unterstützung für Verbindungspools, Wiederholungsversuche und Lastverteilung
  • \n
\n\n

Dank der vollständigen TypeScript-Unterstützung erhalten Sie Autovervollständigung, Typprüfung und Dokumentation direkt in der IDE.

\n\n

Installation

\n\n

Installieren Sie das Paket zunächst über npm oder yarn:

\n\n
npm install @elastic/elasticsearch\n# oder\nyarn add @elastic/elasticsearch
\n\n

Wenn Sie TypeScript verwenden, müssen keine zusätzlichen Typen installiert werden – diese sind bereits im Paket enthalten.

\n\n

Verbindung und Konfiguration des Clients

\n\n

Erstellen Sie eine Instanz des Clients und geben Sie die URL Ihres Elasticsearch-Clusters an:

\n\n
import { Client } from '@elastic/elasticsearch';\n\nconst client = new Client({\n  node: 'http://localhost:9200', // oder Cloud-Endpoint\n  auth: {\n    username: 'elastic',\n    password: 'changeme'\n  },\n  // Für die Produktion wird TLS empfohlen\n  tls: {\n    rejectUnauthorized: false // nur für die Entwicklung!\n  }\n});
\n\n

Für Cloud-Bereitstellungen (Elastic Cloud) verwenden Sie cloud.id und auth.apiKey:

\n\n
const client = new Client({\n  cloud: {\n    id: 'my-cluster:dXMtZWFzdD...'\n  },\n  auth: {\n    apiKey: 'base64EncodedApiKey'\n  }\n});
\n\n

Grundlegende Operationen

\n\n

1. Indizierung eines Dokuments

\n\n

Hinzufügen eines neuen Dokuments zu einem Index:

\n\n
interface Product {\n  id: number;\n  name: string;\n  description: string;\n  price: number;\n  tags: string[];\n}\n\nasync function indexProduct(product: Product) {\n  const response = await client.index({\n    index: 'products',\n    id: String(product.id),\n    body: product,\n    refresh: 'wait_for' // auf Aktualisierung des Index warten\n  });\n  console.log('Document indexed:', response.result);\n}\n\nindexProduct({\n  id: 1,\n  name: 'Lenovo ThinkPad Laptop',\n  description: 'Leistungsstarker Laptop für die Entwicklung',\n  price: 1200,\n  tags: ['Elektronik', 'Laptops']\n});
\n\n

2. Suche nach Dokumenten

\n\n

Einfache Volltextsuche im Feld description:

\n\n
async function searchProducts(query: string) {\n  const response = await client.search({\n    index: 'products',\n    body: {\n      query: {\n        match: {\n          description: query\n        }\n      },\n      // Paginierung\n      from: 0,\n      size: 10\n    }\n  });\n\n  const hits = response.hits.hits.map(hit => hit._source);\n  console.log('Found products:', hits);\n  return hits;\n}\n\nsearchProducts('Laptop Entwicklung');
\n\n

3. Aggregationen

\n\n

Gruppierung von Produkten nach Tags:

\n\n
async function aggregateByTags() {\n  const response = await client.search({\n    index: 'products',\n    body: {\n      size: 0, // keine Dokumente zurückgeben\n      aggs: {\n        by_tag: {\n          terms: {\n            field: 'tags.keyword',\n            size: 20\n          }\n        }\n                    

Empfehlungen