1. 引言
Elasticsearch 是基于 Lucene 的分布式搜索与分析引擎,具备强大的全文检索、聚合统计和日志分析能力;Kibana 则是 Elasticsearch 官方的数据可视化与探索平台,常用于数据查询、仪表盘展示和集群监控。
本文以 Elasticsearch 8.15.0 和 Kibana 8.15.0 为例,全程使用 Docker 完成部署,并补齐单节点启动、网络配置、安全认证关闭、JVM 内存设置等容易遗漏的命令与参数,帮助你快速搭好一套本地可用的 Elastic Stack 环境。
随后,本文还会结合电商商品数据,演示索引创建、文档写入、全文搜索、组合查询、排序分页和聚合统计等常见操作,最后使用 Kibana 的 Discover 功能直接浏览和验证写入的数据。
2. 整体架构与部署顺序
本次部署包含两个容器,并让它们处于同一个 Docker 网络中:
- Elasticsearch:数据存储与检索服务,容器名
elasticsearch,对外暴露9200端口。 - Kibana:可视化界面,容器名
kibana,对外暴露5601端口,通过容器名elasticsearch访问 Elasticsearch。
部署顺序很重要:
由于 Kibana 需要通过容器名elasticsearch解析到 Elasticsearch,两个容器必须处于同一个es-net网络中。
3. 第一步:创建 Docker 网络
两个docker run命令都使用了--net es-net,因此需要先创建该网络,否则容器将因找不到es-net而启动失败。
dockernetwork create es-net创建完成后,可以用下面的命令确认网络存在:
dockernetworkls|grepes-net4. 第二步:启动 Elasticsearch
使用官方镜像docker.elastic.co/elasticsearch/elasticsearch:8.15.0启动单节点 Elasticsearch:
dockerrun-d--nameelasticsearch--netes-net-p9200:9200\-e"discovery.type=single-node"\-e"xpack.security.enabled=false"\-e"xpack.security.enrollment.enabled=false"\-e"ES_JAVA_OPTS=-Xms1g -Xmx1g"\docker.elastic.co/elasticsearch/elasticsearch:8.15.0参数说明:
-d:后台运行容器。--name elasticsearch:将容器命名为elasticsearch,Kibana 后续会通过该名称访问它。--net es-net:加入前面创建的自定义网络。-p 9200:9200:将容器内 9200 端口映射到宿主机。discovery.type=single-node:以单节点模式启动,跳过集群发现。xpack.security.enabled=false:关闭安全认证,便于本地测试,无需密码即可访问。xpack.security.enrollment.enabled=false:关闭节点注册令牌功能,配合安全认证关闭使用。ES_JAVA_OPTS=-Xms1g -Xmx1g:设置 JVM 堆内存最小与最大为 1GB。
这里特意补充一条容易遗漏的配置。Elasticsearch 8.x 默认启用了 HTTP SSL,部分环境下关闭安全认证后,直接通过
http://localhost:9200访问可能得不到响应。此时建议在启动命令中追加-e "xpack.security.http.ssl.enabled=false",明确关闭 HTTP 加密:
dockerrun-d--nameelasticsearch--netes-net-p9200:9200\-e"discovery.type=single-node"\-e"xpack.security.enabled=false"\-e"xpack.security.enrollment.enabled=false"\-e"xpack.security.http.ssl.enabled=false"\-e"ES_JAVA_OPTS=-Xms1g -Xmx1g"\-m2g\docker.elastic.co/elasticsearch/elasticsearch:8.15.0同时建议补充-m 2g限制容器内存。堆内存设为 1GB 后,JVM 还需要额外的堆外内存用于索引、缓存与进程开销,给容器预留 2GB 左右会更稳定。
5. 第三步:启动 Kibana
等 Elasticsearch 启动完成后,再使用官方镜像docker.elastic.co/kibana/kibana:8.15.0启动 Kibana:
dockerrun-d--namekibana--netes-net-p5601:5601\-e"ELASTICSEARCH_HOSTS=http://elasticsearch:9200"\docker.elastic.co/kibana/kibana:8.15.0参数说明:
--name kibana:容器命名为kibana。-p 5601:5601:将 Kibana 界面端口映射到宿主机。ELASTICSEARCH_HOSTS=http://elasticsearch:9200:指定 Kibana 要连接的 Elasticsearch 地址。这里使用的是容器名elasticsearch,因为两者处于同一网络es-net中,Docker 会通过内置 DNS 自动解析。
由于前面已经关闭了 Elasticsearch 的安全认证,Kibana 无需配置用户名和密码即可连接。
6. 第四步:访问 Kibana
启动完成后,打开浏览器访问:
http://localhost:5601首次加载 Kibana 页面会比较慢,等首页正常显示后即可进行后续操作。
7. 电商示例:商品数据写入与测试
下面以电商商品数据为例,演示如何创建索引、写入单条文档,以及使用 Bulk API 批量写入多条商品数据。
点击右下角的Dev Tools,打开对应页面
console里面自带了一个例子,直接删除就行,右侧的窗口是命令执行的返回结果,现在没有执行任何命令,所以是空的。
将以下内容填入console:
# ============================================================# 1. 清理环境:删除已存在的 products 索引(若不存在会报 404,忽略)# ============================================================DELETE /products# ============================================================# 2. 创建 products 索引,并定义字段映射(Mapping)# text 类型用于全文搜索,keyword 类型用于精确过滤和聚合# ============================================================PUT /products{"mappings":{"properties":{"name":{"type":"text"},"brand":{"type":"keyword"},"category":{"type":"keyword"},"price":{"type":"double"},"stock":{"type":"integer"},"tags":{"type":"keyword"},"desc":{"type":"text"},"created_at":{"type":"date"}}}}# ============================================================# 3. 插入单条商品数据(文档 ID = 1)# ============================================================POST /products/_doc/1{"name":"iPhone 15 Pro 256G 钛金属","brand":"Apple","category":"手机","price":8999,"stock":120,"tags":["5G","旗舰","iOS"],"desc":"搭载A17 Pro芯片,支持USB-C接口","created_at":"2024-09-20"}# ============================================================# 4. 批量插入商品数据(Bulk API)# 注意:数据行之间不能有注释,最后必须留一个空行# ============================================================POST /_bulk{"index":{"_index":"products","_id":2}}{"name":"小米14 Ultra","brand":"Xiaomi","category":"手机","price":6499,"stock":200,"tags":["5G","徕卡","旗舰"],"desc":"徕卡光学镜头,骁龙8Gen3","created_at":"2024-02-25"}{"index":{"_index":"products","_id":3}}{"name":"华为 Mate 60 Pro","brand":"Huawei","category":"手机","price":6999,"stock":50,"tags":["5G","卫星通话"],"desc":"支持卫星通话,麒麟芯片","created_at":"2023-08-29"}{"index":{"_index":"products","_id":4}}{"name":"MacBook Air M3 13寸","brand":"Apple","category":"笔记本","price":8999,"stock":80,"tags":["轻薄","办公"],"desc":"M3芯片,续航18小时","created_at":"2024-03-08"}{"index":{"_index":"products","_id":5}}{"name":"索尼 WH-1000XM5 耳机","brand":"Sony","category":"耳机","price":2499,"stock":300,"tags":["降噪","头戴式"],"desc":"行业顶级降噪","created_at":"2022-05-19"}# ============================================================# 5. 查询所有商品# ============================================================GET /products/_search{"query":{"match_all":{}}}# ============================================================# 6. 全文搜索:在 name 字段中搜索“手机”# ============================================================GET /products/_search{"query":{"match":{"name":"手机"}}}# ============================================================# 7. 精确过滤:查找品牌为 Apple 的商品# ============================================================GET /products/_search{"query":{"term":{"brand":"Apple"}}}# ============================================================# 8. 组合查询:Apple 品牌的手机,价格在 5000-9000 之间# must 参与打分,filter 不参与打分但可缓存,速度更快# ============================================================GET /products/_search{"query":{"bool":{"must":[{"term":{"brand":"Apple"}},{"term":{"category":"手机"}}],"filter":[{"range":{"price":{"gte":5000,"lte":9000}}}]}}}# ============================================================# 9. 排序 + 分页:按价格升序,返回前 3 条# ============================================================GET /products/_search{"query":{"match_all":{}},"sort":[{"price":"asc"}],"from":0,"size":3}# ============================================================# 10. 多字段搜索:在 name 和 desc 中搜索“芯片”# ============================================================GET /products/_search{"query":{"multi_match":{"query":"芯片","fields":["name","desc"]}}}# ============================================================# 11. 聚合统计:统计各品牌的商品数量# ============================================================GET /products/_search{"size":0,"aggs":{"by_brand":{"terms":{"field":"brand"}}}}# ============================================================# 12. 电商综合搜索示例:# - 搜索“手机”,商品名权重是描述的 3 倍# - 过滤:Apple 品牌,价格 3000-10000,有库存# - 排序:先按相关性得分降序,再按上架时间降序# - 聚合:返回品牌列表和价格区间统计(用于筛选栏)# ============================================================GET /products/_search{"query":{"bool":{"must":[{"multi_match":{"query":"手机","fields":["name^3","desc"]}}],"filter":[{"term":{"brand":"Apple"}},{"range":{"price":{"gte":3000,"lte":10000}}},{"range":{"stock":{"gt":0}}}]}},"sort":[{"_score":"desc"},{"created_at":"desc"}],"from":0,"size":20,"aggs":{"brands":{"terms":{"field":"brand"}},"price_range":{"range":{"field":"price","ranges":[{"to":3000},{"from":3000,"to":6000},{"from":6000}]}}}}# ============================================================# 13. 更新文档:修改 ID=1 的商品价格和库存# ============================================================POST /products/_update/1{"doc":{"price":8499,"stock":100}}# ============================================================# 14. 删除文档:删除 ID=2 的商品# ============================================================DELETE /products/_doc/2# ============================================================# 15. 删除索引:清理整个 products 索引(如不想删可去掉)# ============================================================DELETE /products在 Console 中分别点击对应命令,右侧会显示运行按钮;点击运行按钮后,右侧窗口会显示该命令的返回结果。
此外,也可以使用 Postman、Apifox 等 HTTP 工具执行上述请求。
8. 使用 Discover 查看数据
进入 Kibana 主界面,点击左侧菜单中的 Stack Management。
在 Kibana 分类下,点击 Data Views,再点击 Create data view。
分别填写 Data view 名称products、索引模式products,时间字段选择created_at,点击保存。
保存后,点击主菜单中的 Analytics - Discover,选择刚创建的productsData View,并在右上角调整时间范围,即可看到刚刚写入的商品数据。
9. 总结
本文通过两个docker run命令快速搭建了一套本地可用的 Elastic Stack 环境,核心步骤如下:
- 创建自定义网络
es-net,让 Elasticsearch 与 Kibana 通过容器名互相访问。 - 以单节点模式启动 Elasticsearch,关闭安全认证并设置 JVM 堆内存,便于本地开发调试。
- 启动 Kibana 并连接到 Elasticsearch,通过
http://localhost:5601访问可视化界面。 - 以电商商品数据为例,完成了索引创建、文档写入、全文搜索、精确过滤、组合查询、排序分页和聚合统计等常见操作。
- 使用 Kibana 的 Discover 功能快速浏览和探索写入的
products数据。
这套环境可以作为入门学习和本地开发的基础,后续还可以继续体验 Kibana 的 Dashboard 仪表盘、可视化图表,以及 Elasticsearch 更丰富的查询与分析能力。