
Elasticsearch是一个基于Apache Lucene构建的分布式、RESTful 风格的搜索和分析引擎。它能够近乎实时地存储、搜索和分析海量数据。一、什么是 Elasticsearch核心概念概念类比 MySQL说明Index索引数据库拥有相似特征的文档集合Type类型表已废弃索引中的逻辑分类6.x后一个索引只有一个类型Document文档行可被索引的基本信息单元JSON格式Field字段列文档中的一个键值对Mapping映射表结构定义字段的数据类型和分析方式Shard分片分表将索引水平切分支持分布式Replica副本备份分片的拷贝提供高可用数据存储示例// 一个典型的 Elasticsearch 文档{index:users,type:_doc,id:1,version:1,source:{name:张三,age:28,email: ,address:北京市朝阳区,interests:[篮球,编程,旅游],created_at:2024-01-01T10:00:00}}二、Elasticsearch 的核心优势1.分布式架构// 天然支持分布式无需额外配置PUT/my_index/_settings{number_of_shards:5,// 5个主分片number_of_replicas:1// 每个分片1个副本}水平扩展通过增加节点线性提升性能高可用分片副本机制节点故障自动切换负载均衡查询请求自动分发到不同节点2.近实时搜索数据写入 → Translog → Refresh1秒 → 可搜索 数据写入 → Translog → Flush30分钟→ 落盘refresh_interval控制刷新频率默认1秒写入后近实时可见适合日志监控等场景3.全文检索能力// 全文搜索示例GET/articles/_search{query:{match:{content:Elasticsearch 搜索引擎}}}分词器支持中文、英文等多种语言分词相关性评分TF-IDF、BM25 算法计算相关度高亮显示自动标记匹配的关键词4.丰富的查询语言// 复杂查询示例GET/orders/_search{query:{bool:{must:[{term:{status:paid}},{range:{amount:{gte:1000}}}],filter:[{term:{user_id:123}}],should:[{match:{remark:VIP}}]}},sort:[{create_time:desc}],from:0,size:20,aggs:{group_by_status:{terms:{field:status}}}}5.聚合分析// 统计每个城市的用户数量和平均年龄GET/users/_search{size:0,aggs:{by_city:{terms:{field:city.keyword},aggs:{avg_age:{avg:{field:age}},user_count:{value_count:{field:user_id}}}}}}6.高性能倒排索引快速定位包含关键词的文档文档存储使用 Lucene 的 FST 存储空间效率高缓存机制Filter Cache、Field Cache 提高查询速度7.易用性# RESTful API通过 HTTP 操作curl-XPUTlocalhost:9200/my_indexcurl-XPOSTlocalhost:9200/my_index/_doc/1-d { title: Elasticsearch 入门, content: 本文介绍 Elasticsearch 的基本概念... }curl-XGETlocalhost:9200/my_index/_search?qtitle:入门8.生态完善Elastic StackELK ├── Elasticsearch # 存储和搜索 ├── Logstash # 数据采集和转换 ├── Kibana # 可视化和分析 └── Beats # 轻量级数据采集器三、应用场景1.搜索引擎// 电商商品搜索GetMapping(/products/search)publicPageProductsearchProducts(Stringkeyword,Pageablepageable){NativeSearchQueryquerynewNativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(keyword,name,description,category)).withPageable(pageable).withSort(SortBuilders.scoreSort().order(SortOrder.DESC)).build();returnproductRepository.search(query);}2.日志分析ELK Stack# Filebeat 配置filebeat.inputs:-type:log paths:-/var/log/nginx/*.logoutput.elasticsearch:hosts:[localhost:9200]# Logstash 配置input{beats{port 5044}}filter{grok{match {message %{COMBINEDAPACHELOG}}}}output{elasticsearch{hosts [localhost:9200]index nginx-%{YYYY.MM.dd}}}3.指标监控// 系统监控数据存储PUT/metrics/_doc/1{timestamp:2024-01-01T10:00:00,host:server-01,cpu_usage:0.65,memory_usage:0.45,disk_usage:0.32,network_in:1024000,network_out:512000}// 实时监控仪表盘Kibana可视化4.推荐系统// 基于用户行为的推荐GET/user_behaviors/_search{query:{more_like_this:{fields:[interests,history],like:[{_index:users,_id:123}],min_term_freq:1,max_query_terms:12}}}5.地理空间查询// 查找附近的门店GET/stores/_search{query:{bool:{filter:{geo_distance:{distance:5km,location:{lat:39.9042,lon:116.4074}}}}}}6.安全分析// 异常行为检测ComponentpublicclassAnomalyDetector{AutowiredprivateElasticsearchRestTemplatetemplate;publicvoiddetectAnomalies(){NativeSearchQueryquerynewNativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(timestamp).gte(now-5m)).must(QueryBuilders.rangeQuery(error_count).gt(100))).withAggregations(AggregationBuilders.terms(by_service).field(service.keyword)).build();SearchHitsLogEventhitstemplate.search(query,LogEvent.class);// 触发告警}}四、与其他技术的对比特性ElasticsearchMySQLMongoDBRedis数据模型文档JSON关系表文档BSON键值对查询语言DSLJSONSQL类似 JSON命令全文搜索⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐聚合分析⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐实时性近实时1秒实时实时实时分布式原生支持需分库分表原生支持集群模式数据持久化⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐适用场景搜索、日志分析OLTP文档存储缓存、计数器五、最佳实践1. 索引设计// 合理的 mapping 设计PUT/my_index{mappings:{properties:{id:{type:keyword},// 精确值用 keywordtitle:{type:text},// 全文检索用 textprice:{type:float},// 数字类型tags:{type:keyword},// 数组create_time:{type:date},// 日期类型location:{type:geo_point}// 地理位置}},settings:{number_of_shards:3,number_of_replicas:1,refresh_interval:5s}}2. 查询优化// 1. 使用 filter 代替 query 当不需要评分时// 2. 避免深度分页from size// 3. 使用 search_after 进行游标分页3. 写入优化// 批量写入POST/_bulk{index:{_index:users}}{name:张三,age:25}{index:{_index:users}}{name:李四,age:30}4. 集群规划节点类型配置作用Master3台CPU 4核内存 8G集群管理DataN台CPU 16核内存 64G数据存储Coordinating2台CPU 8核内存 16G负载均衡六、总结核心价值搜索为王全文检索能力远超传统数据库分析利器实时聚合分析告别离线报表海量数据分布式架构PB级数据轻松应对生态完善ELK Stack 一站式解决方案适用场景决策树是否需要全文搜索 → 是 → Elasticsearch ↓否 是否需要实时聚合分析 → 是 → Elasticsearch ↓否 数据量是否 1亿 → 是 → 考虑 Elasticsearch ↓否 传统关系型数据库可能更适合一句话理解Elasticsearch 就像一个超级搜索引擎 数据分析平台**既能秒级找到你想要的文档搜索又能实时告诉你这些文档的统计规律分析还能自动扩展到海量数据分布式。**