Elasticsearch-Client für TypeScript (@elastic/elasticsearch)
\n\nIn 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.
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
- 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
Dank der vollständigen TypeScript-Unterstützung erhalten Sie Autovervollständigung, Typprüfung und Dokumentation direkt in der IDE.
\n\nInstallation
\n\nInstallieren Sie das Paket zunächst über npm oder yarn:
\n\nnpm install @elastic/elasticsearch\n# oder\nyarn add @elastic/elasticsearch\n\nWenn Sie TypeScript verwenden, müssen keine zusätzlichen Typen installiert werden – diese sind bereits im Paket enthalten.
\n\nVerbindung und Konfiguration des Clients
\n\nErstellen Sie eine Instanz des Clients und geben Sie die URL Ihres Elasticsearch-Clusters an:
\n\nimport { 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\nFür Cloud-Bereitstellungen (Elastic Cloud) verwenden Sie cloud.id und auth.apiKey:
const client = new Client({\n cloud: {\n id: 'my-cluster:dXMtZWFzdD...'\n },\n auth: {\n apiKey: 'base64EncodedApiKey'\n }\n});\n\nGrundlegende Operationen
\n\n1. Indizierung eines Dokuments
\n\nHinzufügen eines neuen Dokuments zu einem Index:
\n\ninterface 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\n2. Suche nach Dokumenten
\n\nEinfache Volltextsuche im Feld description:
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\n3. Aggregationen
\n\nGruppierung von Produkten nach Tags:
\n\nasync 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 Auch in der Bibliothek
Reaktive Programmierung in Rust: Bibliotheken, Frameworks und praktische Beispiele
JSON-Verarbeitung in Swift: Codable, JSONSerialization und praktische Beispiele
Criterion für Rust: Vollständiges Tutorial mit Beispielen
GraphQL in C++: Die Bibliothek cppgraphqlgen zur API-Erstellung