Only available for Node.js.
The Elasticsearch datasource connects to Elasticsearch indices, allowing you to query, filter, and aggregate your data through Forest.
Basic usage
import { createAgent } from '@forestadmin/agent';
import { createElasticsearchDataSource } from '@forestadmin-experimental/datasource-elasticsearch';
const agent = createAgent(options);
agent.addDataSource(
createElasticsearchDataSource({
node: 'http://localhost:9200',
auth: {
username: 'elastic',
password: 'your-password'
}
})
);
Configuration options
Index-based collections
Map each Elasticsearch index to a Forest collection:
createElasticsearchDataSource({
node: 'http://localhost:9200',
indices: [
{
name: 'products',
fields: {
id: { type: 'Number' },
name: { type: 'String' },
price: { type: 'Number' },
category: { type: 'String' },
tags: { type: 'StringList' },
created_at: { type: 'Date' }
}
}
]
})
Template-based collections
Use Elasticsearch index templates to automatically generate collections:
createElasticsearchDataSource({
node: 'http://localhost:9200',
templates: [
{
name: 'logs-*',
fields: {
timestamp: { type: 'Date' },
level: { type: 'String' },
message: { type: 'String' }
}
}
]
})
Authentication
The datasource supports multiple authentication methods:
// Basic authentication
createElasticsearchDataSource({
node: 'https://elastic.example.com:9200',
auth: {
username: 'elastic',
password: 'password'
}
})
// API key authentication
createElasticsearchDataSource({
node: 'https://elastic.example.com:9200',
auth: {
apiKey: 'your-api-key'
}
})
// Bearer token
createElasticsearchDataSource({
node: 'https://elastic.example.com:9200',
auth: {
bearer: 'your-bearer-token'
}
})
SSL/TLS configuration
createElasticsearchDataSource({
node: 'https://elastic.example.com:9200',
tls: {
ca: fs.readFileSync('./ca.crt'),
rejectUnauthorized: true
}
})
Field types
The datasource supports the following field types:
String - Text fields
Number - Numeric fields
Boolean - Boolean fields
Date - Date/datetime fields
StringList - Array of strings
Json - Nested objects (stored as JSON)
Arrays must be explicitly specified using the List suffix (e.g., StringList).
Query capabilities
Filtering
The datasource supports 16+ filter operators:
Equal, NotEqual
GreaterThan, LessThan
In, NotIn
Contains, StartsWith, EndsWith
Present, Blank
Match (full-text search)
- And more
Sorting
Sort records by any field:
// Forest UI automatically generates queries with sorting
// Example: GET /products?sort=-price (descending by price)
Aggregations
The datasource supports Elasticsearch aggregations for charts and analytics:
- Count
- Sum
- Average
- Min/Max
- Terms aggregation (group by)
Native SQL queries
Execute Elasticsearch SQL queries directly:
agent.customizeCollection('products', collection => {
collection.addAction('Run SQL Query', {
scope: 'Global',
execute: async (context) => {
const result = await context.dataSource.executeNativeQuery(
'SELECT category, AVG(price) FROM products GROUP BY category'
);
return result;
}
});
});
Live Query
This datasource supports Live Query for advanced filtering and segmentation. Learn more about Live Queries
Limitations
- No joins - Relationships between indices are not supported
- No object sub-models - Nested objects are flattened to JSON fields
- No geospatial types - Point fields are not supported
- Array specification - Arrays must be manually specified with
List suffix
- Read-heavy - Optimized for search and analytics, not transactional workloads
Elasticsearch 8.x support
This datasource is built for Elasticsearch 8.x and uses the official @elastic/elasticsearch client. It supports:
- Index templates
- Data streams
- Modern query DSL
- SQL API
- Security features (authentication, TLS)
Source code
This connector is open source. Browse the code or contribute on GitHub: @forestadmin-experimental/datasource-elasticsearch.