尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Docker 部署 Elasticsearch + Kibana:电商数据检索入门实战

Docker 部署 Elasticsearch + Kibana:电商数据检索入门实战 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。部署顺序很重要创建 Docker 网络 es-net启动 Elasticsearch等待 ES 就绪启动 Kibana浏览器访问 5601 验证由于 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启动单节点 Elasticsearchdockerrun-d--nameelasticsearch--netes-net-p9200:9200\-ediscovery.typesingle-node\-expack.security.enabledfalse\-expack.security.enrollment.enabledfalse\-eES_JAVA_OPTS-Xms1g -Xmx1g\docker.elastic.co/elasticsearch/elasticsearch:8.15.0参数说明-d后台运行容器。--name elasticsearch将容器命名为elasticsearchKibana 后续会通过该名称访问它。--net es-net加入前面创建的自定义网络。-p 9200:9200将容器内 9200 端口映射到宿主机。discovery.typesingle-node以单节点模式启动跳过集群发现。xpack.security.enabledfalse关闭安全认证便于本地测试无需密码即可访问。xpack.security.enrollment.enabledfalse关闭节点注册令牌功能配合安全认证关闭使用。ES_JAVA_OPTS-Xms1g -Xmx1g设置 JVM 堆内存最小与最大为 1GB。这里特意补充一条容易遗漏的配置。Elasticsearch 8.x 默认启用了 HTTP SSL部分环境下关闭安全认证后直接通过http://localhost:9200访问可能得不到响应。此时建议在启动命令中追加-e xpack.security.http.ssl.enabledfalse明确关闭 HTTP 加密dockerrun-d--nameelasticsearch--netes-net-p9200:9200\-ediscovery.typesingle-node\-expack.security.enabledfalse\-expack.security.enrollment.enabledfalse\-expack.security.http.ssl.enabledfalse\-eES_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启动 Kibanadockerrun-d--namekibana--netes-net-p5601:5601\-eELASTICSEARCH_HOSTShttp://elasticsearch:9200\docker.elastic.co/kibana/kibana:8.15.0参数说明--name kibana容器命名为kibana。-p 5601:5601将 Kibana 界面端口映射到宿主机。ELASTICSEARCH_HOSTShttp://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. 更新文档修改 ID1 的商品价格和库存# POST /products/_update/1{doc:{price:8499,stock:100}}# # 14. 删除文档删除 ID2 的商品# 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 更丰富的查询与分析能力。
返回列表