Elasticsearch Provider
The Elasticsearch provider offers full-text search and analytics with a resilient client wrapper, index lifecycle management, projection store integration, and health monitoring.
Before You Start
- .NET 8.0+ (or .NET 9/10 for latest features)
- An Elasticsearch cluster (local, Elastic Cloud, or AWS OpenSearch)
- Familiarity with data access and projections
Installation
dotnet add package Excalibur.Data.ElasticSearch
Dependencies: Excalibur.Data.Abstractions, Elastic.Clients.Elasticsearch
Quick Start
using Microsoft.Extensions.DependencyInjection;
services.AddElasticsearchServices(configuration);
Registration Options
Basic Registration
// From configuration
services.AddElasticsearchServices(configuration, registry: null);
// With pre-configured client
services.AddElasticsearchServices(elasticsearchClient, registry: null);
// With client settings callback
services.AddElasticsearchServices(configuration, registry: null, configureSettings: settings =>
{
settings.DisableDirectStreaming();
});
Resilient Client
Adds Polly-based retry and circuit breaker policies:
services.AddResilientElasticsearchServices(configuration);
Monitoring
services.AddElasticsearchMonitoring(configuration);
Combined Resilient + Monitoring
services.AddMonitoredResilientElasticsearchServices(configuration);
Index Management
services.AddElasticsearchIndexManagement(configuration);
Projection Store
// Register all projections together (shared cluster)
services.AddElasticSearchProjections("https://es.example.com:9200", projections =>
{
projections.Add<OrderSummary>();
projections.Add<CustomerProfile>(o => o.IndexName = "customers");
});
See Projections for index naming, multi-node clusters, and per-projection overrides.
Health Checks
services.AddHealthChecks()
.AddElasticHealthCheck("elasticsearch", timeout: TimeSpan.FromSeconds(5));
Security
services.AddElasticsearchSecurity(configuration);
Performance Optimizations
services.AddResilientElasticsearchServices(configuration);
Resilient Client
The IResilientElasticsearchClient wraps the Elasticsearch client with retry and circuit breaker policies:
public interface IResilientElasticsearchClient
{
// Operations with automatic retry and circuit breaking
}
Index Lifecycle Management
Manage indices, templates, aliases, and ILM policies:
IIndexInitializer— Bootstrap indices on startupIIndexTemplateManager— Manage index templatesIIndexLifecycleManager— Configure ILM policiesIIndexOperationsManager— CRUD operations on indicesIIndexAliasManager— Manage index aliases
Audit Sink
A separate package provides an Elasticsearch audit sink for real-time audit event indexing:
dotnet add package Excalibur.Dispatch.AuditLogging.Elasticsearch
// With options callback
services.AddElasticsearchAuditSink(options =>
{
// Single node
options.ElasticsearchUrl = "https://es.example.com:9200";
// Or cluster (round-robin)
options.NodeUrls = ["https://es1:9200", "https://es2:9200", "https://es3:9200"];
options.IndexPrefix = "dispatch-audit";
options.ApplicationName = "MyApp"; // fallback if AuditEvent.ApplicationName is null
});
// Or from IConfiguration
services.AddElasticsearchAuditSink(configuration.GetSection("AuditSink:Elasticsearch"));
Elasticsearch serves as a search/analytics sink, not a compliance-grade audit store. Use SQL Server for tamper-evident hash-chained storage. See ADR-290 and Audit Logging Providers.
See Also
- Data Providers Overview — Architecture and core abstractions
- MongoDB Provider — Document store alternative
- Audit Logging Providers — All audit backend configurations
- Observability — Elasticsearch for log aggregation