The official Elasticsearch client for Node.js providing comprehensive access to Elasticsearch clusters through a type-safe JavaScript/TypeScript API
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
The official Elasticsearch Node.js client providing comprehensive access to Elasticsearch clusters through a type-safe JavaScript/TypeScript API. It supports all Elasticsearch operations including document management, search queries, cluster administration, machine learning, security, and specialized features across stack and serverless deployments.
npm install @elastic/elasticsearchimport { Client } from "@elastic/elasticsearch";For CommonJS:
const { Client } = require("@elastic/elasticsearch");Advanced imports for custom configurations:
import {
Client,
SniffingTransport,
errors,
estypes,
helpers,
type ClientOptions,
type NodeOptions
} from "@elastic/elasticsearch";Transport layer imports for custom connection handling:
import {
Client,
SniffingTransport,
Diagnostic,
Transport,
WeightedConnectionPool,
ClusterConnectionPool,
BaseConnectionPool,
CloudConnectionPool,
BaseConnection,
HttpConnection,
UndiciConnection,
Serializer,
events
} from "@elastic/elasticsearch";All available imports (comprehensive):
// Core client and types
import { Client, SniffingTransport } from "@elastic/elasticsearch";
import type { ClientOptions, NodeOptions } from "@elastic/elasticsearch";
// All types (re-exported from @elastic/transport)
import * as estypes from "@elastic/elasticsearch";
// Helper functions
import { helpers } from "@elastic/elasticsearch";
// Transport layer components
import {
Diagnostic,
Transport,
WeightedConnectionPool,
ClusterConnectionPool,
BaseConnectionPool,
CloudConnectionPool,
BaseConnection,
HttpConnection,
UndiciConnection,
Serializer,
errors,
events
} from "@elastic/elasticsearch";import { Client } from "@elastic/elasticsearch";
// Basic client connection
const client = new Client({
node: "https://localhost:9200",
auth: {
username: "elastic",
password: "password"
}
});
// Document operations
await client.index({
index: "my-index",
id: "1",
document: { title: "Hello World", content: "This is a test document" }
});
const response = await client.get({
index: "my-index",
id: "1"
});
// Search documents
const searchResult = await client.search({
index: "my-index",
query: { match: { title: "Hello" } }
});The Elasticsearch client is built around several key components:
Core client configuration, connection management, and lifecycle operations for establishing and maintaining Elasticsearch cluster connections.
class Client extends API {
constructor(opts: ClientOptions);
child(opts: ClientOptions): Client;
close(): Promise<void>;
// Properties
diagnostic: Diagnostic;
name: string | symbol;
connectionPool: BaseConnectionPool;
transport: SniffingTransport;
serializer: Serializer;
helpers: Helpers;
}
interface ClientOptions {
/** Elasticsearch node settings, if there is only one node */
node?: string | string[] | NodeOptions | NodeOptions[];
/** Elasticsearch node settings, if there are multiple nodes */
nodes?: string | string[] | NodeOptions | NodeOptions[];
/** HTTP connection class to use */
Connection?: typeof BaseConnection;
/** HTTP connection pool class to use */
ConnectionPool?: typeof BaseConnectionPool;
/** Elastic transport class to use */
Transport?: typeof Transport;
/** Serialization class to use */
Serializer?: typeof Serializer;
/** Max number of retries for each request */
maxRetries?: number;
/** Max request timeout in milliseconds for each request */
requestTimeout?: number;
/** Max number of milliseconds a ClusterConnectionPool will wait when pinging nodes */
pingTimeout?: number;
/** Perform a sniff operation every n milliseconds */
sniffInterval?: number | boolean;
/** Perform a sniff once the client is started */
sniffOnStart?: boolean;
/** Endpoint to ping during a sniff */
sniffEndpoint?: string;
/** Perform a sniff on connection fault */
sniffOnConnectionFault?: boolean;
/** Strategy for resurrecting dead nodes */
resurrectStrategy?: 'ping' | 'optimistic' | 'none';
/** Enables gzip request body compression */
compression?: boolean;
/** TLS configuration */
tls?: TlsConnectionOptions;
/** Custom HTTP agent options */
agent?: HttpAgentOptions | UndiciAgentOptions | agentFn | false;
/** Custom function to determine which nodes are qualified to receive a request */
nodeFilter?: nodeFilterFn;
/** Custom function to determine which node should receive the next request */
nodeSelector?: nodeSelectorFn;
/** Custom HTTP headers that should be sent with each request */
headers?: Record<string, any>;
/** A string prefix to apply to every generated X-Opaque-Id header */
opaqueIdPrefix?: string;
/** Custom function for generating unique IDs for each request */
generateRequestId?: generateRequestIdFn;
/** A name for this client */
name?: string | symbol;
/** Authentication options for this Elasticsearch cluster */
auth?: BasicAuth | ApiKeyAuth | BearerAuth;
/** Custom object attached to each request for passing data to client events */
context?: Context;
/** Proxy URL that the client will send all requests through */
proxy?: string | URL;
/** If true, adds x-elastic-client-meta header with client telemetry data */
enableMetaHeader?: boolean;
/** Custom configuration for connecting to Elastic Cloud */
cloud?: { id: string };
/** Disables safe JSON parsing that protects against prototype poisoning attacks */
disablePrototypePoisoningProtection?: boolean | 'proto' | 'constructor';
/** CA certificate fingerprint for SSL verification */
caFingerprint?: string;
/** Maximum uncompressed response size in bytes */
maxResponseSize?: number;
/** Maximum compressed response size in bytes */
maxCompressedResponseSize?: number;
/** Options for redacting sensitive data from Error objects */
redaction?: RedactionOptions;
/** Server mode setting - "stack" for traditional ES, "serverless" for Elastic Cloud Serverless */
serverMode?: 'stack' | 'serverless';
}Essential CRUD operations for managing individual documents and bulk operations with versioning, routing, and refresh control.
// Single document operations
function index(params: {
index: IndexName;
id?: Id;
document: TDocument;
refresh?: Refresh;
routing?: Routing;
}): Promise<TransportResult<IndexResponse, unknown>>;
function get(params: {
index: IndexName;
id: Id;
_source?: boolean | Fields;
routing?: Routing;
}): Promise<TransportResult<GetResponse<TDocument>, unknown>>;
function update(params: {
index: IndexName;
id: Id;
doc?: Partial<TDocument>;
script?: Script;
refresh?: Refresh;
}): Promise<TransportResult<UpdateResponse<TDocument>, unknown>>;
function delete(params: {
index: IndexName;
id: Id;
refresh?: Refresh;
routing?: Routing;
}): Promise<TransportResult<DeleteResponse, unknown>>;
// Bulk operations
function bulk(params: {
index?: IndexName;
operations: BulkOperationContainer[];
refresh?: Refresh;
}): Promise<TransportResult<BulkResponse, unknown>>;Comprehensive search functionality including query DSL, aggregations, sorting, highlighting, and specialized search features.
function search<TDocument = unknown, TAggregations = Record<AggregateName, AggregationsAggregate>>(params: {
index?: Indices;
query?: QueryDslQueryContainer;
aggs?: Record<string, AggregationsAggregationContainer>;
sort?: SortCombinations[];
_source?: boolean | Fields;
from?: number;
size?: number;
highlight?: SearchHighlight;
track_total_hits?: boolean | number;
}): Promise<TransportResult<SearchResponse<TDocument, TAggregations>, unknown>>;
function msearch(params: {
searches: MsearchMultisearchBody[];
index?: Indices;
}): Promise<TransportResult<MsearchResponse, unknown>>;
function scroll(params: {
scroll_id: ScrollId;
scroll?: Duration;
}): Promise<TransportResult<ScrollResponse<TDocument>, unknown>>;Complete index lifecycle management including creation, deletion, mappings, settings, aliases, and templates.
namespace indices {
function create(params: {
index: IndexName;
aliases?: Record<IndexName, IndicesAlias>;
mappings?: MappingTypeMapping;
settings?: IndicesIndexSettings;
}): Promise<TransportResult<IndicesCreateResponse, unknown>>;
function putMapping(params: {
index: Indices;
properties?: Record<PropertyName, MappingProperty>;
dynamic?: MappingDynamicMapping;
}): Promise<TransportResult<IndicesputMappingResponse, unknown>>;
function putSettings(params: {
index: Indices;
settings: IndicesIndexSettings;
}): Promise<TransportResult<IndicesputSettingsResponse, unknown>>;
}Cluster-wide operations including health monitoring, statistics, settings management, and node coordination.
namespace cluster {
function health(params?: {
index?: Indices;
level?: Level;
wait_for_status?: HealthStatus;
timeout?: Duration;
}): Promise<TransportResult<ClusterHealthResponse, unknown>>;
function stats(params?: {
node_id?: NodeIds;
flat_settings?: boolean;
timeout?: Duration;
}): Promise<TransportResult<ClusterStatsResponse, unknown>>;
function putSettings(params: {
persistent?: Record<string, any>;
transient?: Record<string, any>;
}): Promise<TransportResult<ClusterPutSettingsResponse, unknown>>;
}Complete ML operations including anomaly detection jobs, data frame analytics, trained model management, and datafeeds.
namespace ml {
function putJob(params: {
job_id: Id;
analysis_config: MlAnalysisConfig;
data_description: MlDataDescription;
description?: string;
}): Promise<TransportResult<MlPutJobResponse, unknown>>;
function putTrainedModel(params: {
model_id: Id;
compressed_definition?: string;
inference_config?: MlInferenceConfigContainer;
input: MlTrainedModelConfigInput;
}): Promise<TransportResult<MlPutTrainedModelResponse, unknown>>;
}Authentication, authorization, user management, API keys, and SSL certificate operations.
namespace security {
function putUser(params: {
username: Username;
password?: Password;
roles: string[];
full_name?: string;
email?: string;
}): Promise<TransportResult<SecurityPutUserResponse, unknown>>;
function createApiKey(params: {
name: Name;
role_descriptors?: Record<string, SecurityRoleDescriptor>;
expiration?: Duration;
}): Promise<TransportResult<SecurityCreateApiKeyResponse, unknown>>;
}High-level utilities for common patterns including simplified search, bulk operations, and scrolling.
interface Helpers {
search<TDocument>(
params: SearchRequest,
options?: TransportRequestOptions
): Promise<Array<TDocument & { _id: Id }>>;
scrollSearch<TDocument>(
params: SearchRequest,
options?: ScrollSearchOptions
): AsyncIterable<ScrollSearchResponse<TDocument>>;
bulk<TDocument>(
params: BulkHelperOptions<TDocument>,
options?: TransportRequestOptions
): BulkHelper<TDocument>;
msearch(
params: MsearchHelperOptions,
options?: TransportRequestOptions
): MsearchHelper;
}Human-readable cluster information endpoints providing tabular output for monitoring and debugging.
namespace cat {
function health(params?: {
format?: string;
h?: string[];
v?: boolean;
}): Promise<TransportResult<CatHealthRecord[], unknown>>;
function indices(params?: {
index?: Indices;
format?: string;
h?: string[];
bytes?: Bytes;
}): Promise<TransportResult<CatIndicesRecord[], unknown>>;
function nodes(params?: {
format?: string;
h?: string[];
full_id?: boolean;
}): Promise<TransportResult<CatNodesRecord[], unknown>>;
}Specialized Elasticsearch features including snapshots, transforms, watchers, and cross-cluster replication.
// Snapshot operations
namespace snapshot {
function create(params: {
repository: Name;
snapshot: Name;
indices?: Indices;
wait_for_completion?: boolean;
}): Promise<TransportResult<SnapshotCreateResponse, unknown>>;
}
// Data transformation
namespace transform {
function putTransform(params: {
transform_id: Id;
source: TransformSource;
dest: TransformDestination;
pivot?: TransformPivot;
}): Promise<TransportResult<TransformPutTransformResponse, unknown>>;
}type IndexName = string;
type Id = string | number;
type Routing = string;
type Refresh = boolean | 'wait_for' | 'false' | 'true';
type Duration = string; // e.g., "1m", "30s", "2h"
interface BasicAuth {
username: string;
password: string;
}
interface ApiKeyAuth {
id: string;
api_key: string;
}
interface BearerAuth {
bearer: string;
}interface TransportResult<TResponse, TContext> {
body: TResponse;
statusCode: number;
headers: Record<string, string | string[]>;
warnings: string[];
meta: {
context: TContext;
name: string;
request: { params: TransportRequestParams; options: TransportRequestOptions };
connection: Connection;
attempts: number;
aborted: boolean;
};
}
interface SearchResponse<TDocument = unknown, TAggregations = Record<AggregateName, AggregationsAggregate>> {
took: number;
timed_out: boolean;
_shards: ShardStatistics;
hits: SearchHitsMetadata<TDocument>;
aggregations?: TAggregations;
}import { errors } from "@elastic/elasticsearch";
try {
await client.get({ index: "my-index", id: "1" });
} catch (error) {
if (error instanceof errors.ResponseError) {
console.log("Elasticsearch error:", error.body);
} else if (error instanceof errors.ConnectionError) {
console.log("Connection error:", error.message);
} else if (error instanceof errors.TimeoutError) {
console.log("Request timeout:", error.message);
}
}Install with Tessl CLI
npx tessl i tessl/npm-elastic--elasticsearch