Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它能快速处理海量数据,支持全文搜索和复杂的数据分析,广泛应用于电商搜索、日志分析、安全监控等场景。下面用最简单的语言介绍其基础知识,并配合实际代码示例,帮助你快速上手。
什么是 Elasticsearch?
- 核心功能:把数据存成“文档”,通过“索引”快速查找,支持全文搜索和数据统计分析。数据写入后,通常1秒内即可被搜索到,实时性强。
- 分布式架构:多个服务器(节点)组成集群,数据分成多个“分片”,每个分片有主分片和副本,保证数据安全和查询速度。
- 数据格式:所有数据以 JSON 格式存储,结构灵活,适合各种数据类型。
- Elastic Stack:Elasticsearch 通常和 Logstash(数据采集)、Kibana(数据可视化)配合使用,组成完整的数据处理链。
基本概念
| 名称 | 说明 | 类比关系 |
|---|---|---|
| 集群(Cluster) | 多台服务器组成的整体系统 | 数据库服务器集群 |
| 节点(Node) | 集群中的一台服务器实例 | 单台数据库服务器 |
| 索引(Index) | 存储一类数据的地方,相当于数据库中的表 | 数据库中的表 |
| 文档(Document) | 索引中的一条数据,JSON格式 | 表中的一行数据 |
| 字段(Field) | 文档中的属性,比如姓名、年龄等 | 表中的列 |
| 分片(Shard) | 索引被拆分成的多个部分,分散存储和查询 | 数据库分区 |
| 副本(Replica) | 分片的备份,提高容错和查询性能 | 数据库的备份 |
Elasticsearch 典型应用场景
- 全文搜索:电商商品搜索、网站内容检索,支持多字段搜索和高亮显示。
- 日志分析与监控:实时收集系统和应用日志,快速定位问题,结合 Kibana 可视化展示。
- 安全分析:快速搜索海量安全日志,发现异常行为。
- 推荐系统:分析用户行为,个性化推荐商品或内容。
- 地理位置搜索:基于位置的搜索,如外卖配送、旅游推荐。
快速入门实战案例
1. 安装与启动
- 需要安装 Java 8 及以上版本。
- 下载 Elasticsearch,解压后进入目录,运行:
bash
./bin/elasticsearch
- 默认监听端口是 9200,浏览器访问
http://localhost:9200,看到类似下面的JSON表示启动成功:
{
"name": "node-1",
"cluster_name": "elasticsearch",
"version": {
"number": "7.17.0"
},
"tagline": "You Know, for Search"
}
- 如果遇到内存限制,执行:
bash
sudo sysctl -w vm.max_map_count=262144
2. 创建索引(类似数据库建表)
创建一个名为 product_info 的索引,设置5个主分片,1个副本,并定义字段类型(使用中文分词器 IK):
PUT /product_info
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"productName": {
"type": "text",
"analyzer": "ik_smart"
},
"annual_rate": {
"type": "keyword"
},
"describe": {
"type": "text",
"analyzer": "ik_smart"
}
}
}
}
注意:7.0及以上版本不再使用
type字段,直接定义properties。
3. 插入文档(添加数据)
向 product_info 索引插入一条商品数据:
POST /product_info/_doc
{
"productName": "智能手机",
"annual_rate": "5%",
"describe": "高性能智能手机,支持5G"
}
4. 简单搜索
搜索商品名称中包含“手机”的文档:
bash
GET /product_info/_search
{
"query": {
"match": {
"productName": "手机"
}
}
}
5. 高亮显示关键词
搜索描述中包含“5G”,并高亮显示关键词:
GET /product_info/_search
{
"query": {
"match": {
"describe": "5G"
}
},
"highlight": {
"fields": {
"describe": {}
}
}
}
返回结果中,匹配的“5G”会被高亮标记,方便用户快速定位。
6. 聚合统计示例
统计商品中不同年利率的数量分布:
GET /product_info/_search
{
"size": 0,
"aggs": {
"rate_counts": {
"terms": {
"field": "annual_rate.keyword"
}
}
}
}
返回类似:
{
"aggregations": {
"rate_counts": {
"buckets": [
{ "key": "5%", "doc_count": 10 },
{ "key": "6%", "doc_count": 5 }
]
}
}
}
7. 更新文档
局部更新文档ID为1的内容:
POST /product_info/_update/1
{
"doc": {
"describe": "更新后的描述,支持5G和AI"
}
}
8. 删除文档
删除ID为1的文档:
DELETE /product_info/_doc/1
进阶建议
- 中文分词:安装 IK 分词器插件,提升中文搜索效果。
- 多字段搜索:使用
multi_match查询,实现多个字段同时搜索。 - 复杂查询:结合
bool查询实现多条件过滤(如范围、精确匹配等)。 - 数据可视化:使用 Kibana 连接 Elasticsearch,创建仪表盘,实时监控数据。
- 日志采集:结合 Logstash 和 Beats 实现日志的实时采集和处理。
真实案例代码示例:电商商品搜索
GET /products/_search
{
"query": {
"multi_match": {
"query": "华为手机",
"fields": ["name", "description"]
}
},
"highlight": {
"fields": {
"name": {},
"description": {}
}
},
"sort": [
{ "price": { "order": "asc" } }
],
"from": 0,
"size": 10
}
- 说明:搜索“华为手机”,在商品名称和描述字段中匹配,返回前10条结果,按价格升序排序,并高亮显示匹配词。
总结
Elasticsearch 是一个强大的实时搜索和分析工具,核心是将数据以 JSON 文档形式存储在索引中,支持分布式架构保证高性能和高可用。通过简单的 REST API,用户可以创建索引、插入数据、执行搜索和聚合分析。结合 Kibana 等工具,可以实现数据的可视化和实时监控,广泛应用于电商搜索、日志分析、安全审计等领域。
掌握基础概念和操作后,可以根据业务需求设计索引结构,灵活使用查询和聚合功能,提升数据处理效率和用户体验。
以上内容基于多方权威资料整理,配合实用示例,帮助你快速理解和使用 Elasticsearch