目录
一、Elasticsearch核心概念回顾
在深入实战之前,我们先快速回顾Elasticsearch的核心概念:
倒排索引:通过词项(Term)到文档的映射实现快速检索
分片(Shard):数据水平拆分的存储单元
副本(Replica):保证高可用的数据冗余
文档(Document):存储的基本数据单元(JSON格式)
索引(Index):具有相似特征文档的集合
二、环境准备与快速部署
1. 单节点部署(开发环境)
# 使用Docker快速部署
docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
elasticsearch:8.9.0
2. 集群部署建议(生产环境)
至少3个主节点(node.master: true)
数据节点根据数据量横向扩展
使用专用协调节点处理查询请求
三、典型应用场景实战
场景1:日志分析与监控系统
架构方案:
Filebeat -> Logstash -> Elasticsearch -> Kibana
实现步骤:
-
创建日志索引模板
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"level": { "type": "keyword" },
"message": { "type": "text" }
}
}
}
}
- 使用Filebeat收集日志
# filebeat.yml配置示例
filebeat.inputs:
- type: filestream
paths:
- /var/log/*.log
output.logstash:
hosts: ["logstash:5044"]
- Kibana可视化分析
- 创建Timelion时序图表
- 构建错误日志统计仪表盘
场景2:电商商品搜索
核心功能实现:
// Spring Boot集成示例
@Autowired
private ElasticsearchOperations operations;
public SearchHits<Product> searchProducts(String keyword, String category) {
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("name", keyword))
.filter(QueryBuilders.termQuery("category", category))
)
.withPageable(PageRequest.of(0, 10))
.build();
return operations.search(query, Product.class);
}
特色功能实现:
-
拼音搜索(使用pinyin分析插件)
-
商品属性聚合
GET /products/_search
{
"aggs": {
"categories": {
"terms": { "field": "category.keyword" }
}
}
}
场景3:地理位置服务
-
创建地理索引
PUT /hotels
{
"mappings": {
"properties": {
"name": { "type": "text" },
"location": { "type": "geo_point" }
}
}
}
-
附近酒店查询
GET /hotels/_search
{
"query": {
"geo_distance": {
"distance": "2km",
"location": {
"lat": 31.2304,
"lon": 121.4737
}
}
},
"sort": [
{
"_geo_distance": {
"location": "31.2304,121.4737",
"order": "asc",
"unit": "km"
}
}
]
}
场景4:实时业务监控
实时数据看板实现:
-
使用Metricbeat采集服务器指标
-
创建时序索引(Rollover策略)
PUT /_ilm/policy/metrics_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "30d"
}
}
}
}
}
}
四、性能优化实践
-
索引设计优化:
-
合理设置分片数(建议单个分片20-50GB)
-
冷热数据分离架构
-
使用alias实现零停机索引切换
-
-
查询优化技巧:
-
避免深度分页(使用search_after)
-
合理使用filter上下文
-
限制返回字段
-
-
JVM配置建议:
-
堆内存不超过32GB
-
预留50%内存给文件系统缓存
-
五、常见问题排查
-
集群健康状态异常:
-
检查分片分配情况:
GET _cat/shards?v
-
查看未分配分片原因:
GET _cluster/allocation/explain
-
-
查询性能问题:
-
使用Profile API分析查询瓶颈
-
检查慢查询日志
-
-
磁盘空间不足:
-
启用索引压缩:
PUT /index/_settings { "index.codec": "best_compression" }
-
清理过期数据
-
六、最佳实践总结
-
数据建模建议:
-
避免过度嵌套文档
-
合理选择字段类型
-
控制索引字段数量
-
-
安全建议:
-
启用HTTPS通信
-
配置基于角色的访问控制(RBAC)
-
-
监控体系:
-
定期收集集群健康指标
-
设置磁盘使用率预警
-
相关资源推荐:
-
官方文档:Documentation
-
Elastic中文社区:https://elasticsearch.cn/
-
《Elasticsearch实战》