# spring-data-elasticsearch
> Spring Data Elasticsearch for full-text search and analytics.
Covers ElasticsearchOperations, repositories, aggregations, and index management.
USE WHEN: user mentions "spring data elasticsearch", "ElasticsearchRepository",
"ElasticsearchOperations", "@Document elasticsearch", "Spring Boot Elasticsearch"
DO NOT USE FOR: raw Elasticsearch queries - use `elasticsearch` instead,
ELK stack setup - use `elasticsearch` instead
- Author: mariepellegrino89
- Repository: claude-dev-suite/claude-dev-suite
- Version: 20260206202537
- Stars: 0
- Forks: 0
- Last Updated: 2026-02-06
- Source: https://github.com/claude-dev-suite/claude-dev-suite
- Web: https://mule.run/skillshub/@@claude-dev-suite/claude-dev-suite~spring-data-elasticsearch:20260206202537
---
---
name: spring-data-elasticsearch
description: |
Spring Data Elasticsearch for full-text search and analytics.
Covers ElasticsearchOperations, repositories, aggregations, and index management.
USE WHEN: user mentions "spring data elasticsearch", "ElasticsearchRepository",
"ElasticsearchOperations", "@Document elasticsearch", "Spring Boot Elasticsearch"
DO NOT USE FOR: raw Elasticsearch queries - use `elasticsearch` instead,
ELK stack setup - use `elasticsearch` instead
allowed-tools: Read, Grep, Glob, Write, Edit
---
# Spring Data Elasticsearch - Quick Reference
> **Full Reference**: See [advanced.md](advanced.md) for aggregations, autocomplete/suggestions, bulk operations, index management, and Testcontainers integration.
> **Deep Knowledge**: Use `mcp__documentation__fetch_docs` with technology: `spring-data-elasticsearch` for comprehensive documentation.
## Dependencies
```xml
org.springframework.boot
spring-boot-starter-data-elasticsearch
```
## Configuration
```yaml
spring:
elasticsearch:
uris: http://localhost:9200
username: ${ELASTICSEARCH_USERNAME:}
password: ${ELASTICSEARCH_PASSWORD:}
connection-timeout: 5s
socket-timeout: 30s
```
## Document Mapping
```java
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "standard")
private String name;
@Field(type = FieldType.Text, analyzer = "standard")
private String description;
@Field(type = FieldType.Keyword)
private String category;
@Field(type = FieldType.Double)
private BigDecimal price;
@Field(type = FieldType.Integer)
private Integer stock;
@Field(type = FieldType.Boolean)
private boolean active;
@Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second)
private LocalDateTime createdAt;
@Field(type = FieldType.Nested)
private List attributes;
@Field(type = FieldType.Keyword)
private List tags;
}
```
## Repository Pattern
```java
public interface ProductRepository extends ElasticsearchRepository {
List findByCategory(String category);
List findByNameContaining(String name);
List findByPriceBetween(BigDecimal min, BigDecimal max);
List findByActiveTrue();
// Pagination
Page findByCategory(String category, Pageable pageable);
// Sorting
List findByCategoryOrderByPriceAsc(String category);
// Count / Exists / Delete
long countByCategory(String category);
boolean existsByName(String name);
void deleteByCategory(String category);
}
```
### Custom Queries
```java
public interface ProductRepository extends ElasticsearchRepository {
@Query("""
{
"multi_match": {
"query": "?0",
"fields": ["name^3", "description", "tags"],
"type": "best_fields",
"fuzziness": "AUTO"
}
}
""")
Page fullTextSearch(String query, Pageable pageable);
}
```
## ElasticsearchOperations
```java
@Service
@RequiredArgsConstructor
public class ProductSearchService {
private final ElasticsearchOperations elasticsearchOperations;
public SearchHits search(ProductSearchCriteria criteria) {
BoolQuery.Builder boolQuery = new BoolQuery.Builder();
if (StringUtils.hasText(criteria.getQuery())) {
boolQuery.must(MultiMatchQuery.of(m -> m
.query(criteria.getQuery())
.fields("name^3", "description", "tags")
.fuzziness("AUTO")
)._toQuery());
}
if (StringUtils.hasText(criteria.getCategory())) {
boolQuery.filter(TermQuery.of(t -> t
.field("category")
.value(criteria.getCategory())
)._toQuery());
}
NativeQuery query = NativeQuery.builder()
.withQuery(boolQuery.build()._toQuery())
.withPageable(PageRequest.of(criteria.getPage(), criteria.getSize()))
.build();
return elasticsearchOperations.search(query, Product.class);
}
}
```
## Best Practices
| Do | Don't |
|----|-------|
| Use appropriate field types | Map everything as text |
| Define proper analyzers | Use default for all |
| Use filters for exact matches | Use match for keywords |
| Paginate large result sets | Fetch all documents at once |
## When NOT to Use This Skill
- **Raw Elasticsearch API** - Use `elasticsearch` skill for REST API
- **ELK stack setup** - Use `elasticsearch` skill
- **Primary database** - Elasticsearch is for search, not ACID transactions
## Anti-Patterns
| Anti-Pattern | Problem | Solution |
|--------------|---------|----------|
| Refresh after each write | Performance degradation | Use refresh_interval, batch |
| Deep pagination with from/size | Memory issues | Use search_after |
| Mapping all as text | Poor search, high disk | Use appropriate field types |
| No index lifecycle | Disk exhaustion | Configure ILM policies |
| Fetching all fields | Wasted bandwidth | Use source filtering |
## Quick Troubleshooting
| Problem | Diagnostic | Fix |
|---------|------------|-----|
| Connection failed | Check Elasticsearch running | Start ES, check URI, SSL |
| Index not found | Check index name | Create index, check @Document |
| Mapping conflict | Check field types | Reindex with correct mapping |
| Search returns nothing | Check analyzer | Test with _analyze API |
| Version conflict | Check @Version | Handle OptimisticLockingFailureException |
## Production Checklist
- [ ] Cluster configured (3+ nodes)
- [ ] Shards and replicas set
- [ ] Index lifecycle management
- [ ] Proper mapping defined
- [ ] Analyzers configured
- [ ] Bulk operations for indexing
- [ ] Monitoring enabled
- [ ] Security enabled
## Reference Documentation
- [Spring Data Elasticsearch Reference](https://docs.spring.io/spring-data/elasticsearch/reference/)