资讯动态

Elasticsearch 实战系列(一):从核心基础概念入门到实战落地

发布时间:2026/8/7 3:31:50 来源:尧图企业网站定制
Elasticsearch 实战系列一从核心基础概念入门到实战落地一、初识 Elasticsearch是什么、为什么用、用在哪1.1 核心定义Elasticsearch简称 ES是一个基于 Apache Lucene 构建的分布式、近实时的搜索与分析引擎是 Elastic Stack原 ELK 技术栈Elasticsearch、Logstash、Kibana的核心组件。它通过 RESTful API 对外提供服务以 JSON 格式存储文档数据能够实现海量数据的快速检索、统计分析是目前业界最主流的全文检索引擎。1.2 核心特性分布式高可用架构天然支持集群部署数据分片存储可通过增减节点实现无缝水平扩展近实时搜索从文档写入索引到可被检索延迟通常在 1 秒以内满足绝大多数实时业务需求强大的全文检索能力内置多种分词器支持复杂的文本匹配、模糊查询、相关性排序对中文场景有成熟的适配方案RESTful API 风格所有操作均可通过 HTTP 接口完成无语言绑定适配所有开发语言多租户能力支持多索引、跨索引联合查询可灵活隔离不同业务的数据文档导向存储以 JSON 格式存储结构化 / 半结构化数据无需提前严格定义表结构适配灵活的业务场景1.3 主流应用场景ES 的能力覆盖搜索、分析、监控三大核心方向主流落地场景包括通用搜索引擎电商商品搜索、内容平台文章 / 视频搜索、站内全局搜索日志实时分析搭配 ELK/EFK 技术栈实现海量服务日志的采集、存储、检索、可视化分析是微服务架构下的日志排查核心方案实时数据分析业务数据的实时统计、聚合分析比如电商订单实时大盘、用户行为数据统计系统监控与告警结合指标数据实现系统可用性监控、APM 性能监控、异常阈值告警个性化推荐系统基于用户行为数据实现内容、商品的个性化推荐检索1.4 ES vs 传统关系型数据库MySQL核心差异与互补很多新手会疑惑有了 MySQL为什么还要用 ES这里通过表格清晰对比两者的核心差异明确各自的适用边界核心特性ElasticsearchMySQL数据模型文档型JSON 格式无固定表结构关系型二维表结构需提前定义 Schema查询语言DSLJSON 格式的查询语法SQL 结构化查询语言核心定位全文检索、海量数据统计分析事务型业务数据存储、强一致性事务处理扩展能力天然支持水平扩展可无缝扩容节点以垂直扩展为主水平扩展需分库分表复杂度高全文检索原生支持内置分词、相关性排序能力仅支持基础模糊查询全文检索需额外插件适配性能差事务支持无完整事务支持不支持跨行事务完整支持 ACID 事务支持行级锁、表级锁写入性能批量写入性能优异适合海量数据高吞吐写入事务写入有性能开销适合强一致性的业务数据写入重点说明ES 并非用来替代 MySQL而是形成互补。绝大多数业务场景中都是 MySQL 存储核心业务事务数据ES 同步数据实现全文检索与统计分析两者搭配实现完整的业务能力。二、ES 核心概念用 MySQL 类比快速入门对于熟悉 MySQL 的开发者最快理解 ES 核心概念的方式就是通过与 MySQL 的术语类比先建立整体认知再逐个拆解细节。2.1 核心概念对照表ES ↔ MySQLElasticsearch 术语MySQL 对应术语核心说明Index索引Database数据库存储文档数据的容器一个索引对应一类业务数据类似 MySQL 中一个库Type类型Table表7.x 版本已废弃8.x 完全移除7.x 之后一个索引仅支持固定的_doc类型无需自定义Document文档Row行一条完整的数据记录以 JSON 格式存储类似 MySQL 中表的一行数据Field字段Column列文档中的属性字段类似 MySQL 中表的一列Mapping映射Schema表结构定义索引中字段的类型、分词规则、存储方式等类似 MySQL 的表结构定义Shard分片Partition分区索引的数据分片将一个索引的数据拆分到多个节点存储实现水平扩展2.2 核心概念详解2.2.1 索引Index索引是 ES 中存储同类型文档的集合是 ES 数据管理的顶级单元类似 MySQL 中的数据库。索引的命名有严格的规则限制不符合规则的索引会创建失败具体规则如下✅ 仅支持小写字母 ✅ 不能以 -、_、 开头 ✅ 不能包含 \、/、*、?、、、、|、空格、逗号、# 等特殊字符 ✅ 名称长度不能超过255字节合法索引名称示例user_index、product-2026、log_app_202603012.2.2 文档Document文档是 ES 中可被索引、检索的最小数据单元对应 MySQL 中的一行数据以 JSON 格式存储支持灵活的结构化、半结构化数据。一个标准的文档示例如下{ id: 1, name: 张三, age: 25, email: zhangsanexample.com, tags: [Java, Elasticsearch], create_time: 2026-01-01T10:00:00 }每个文档都有唯一的_id标识可手动指定也可由 ES 自动生成同时自带_index、_version等元数据用于标识文档所属索引、版本号等信息。2.2.3 映射MappingMapping 定义了索引中字段的类型、分词规则、是否索引、是否存储等属性类似 MySQL 中的表结构定义。ES 支持动态映射写入数据时自动推断字段类型但生产环境强烈建议手动定义 Mapping避免自动推断导致的类型错误影响检索效果。ES 常用的字段类型如下表是 Mapping 设计的核心字段类型核心说明典型适用场景text全文本类型写入时会进行分词支持全文检索不支持排序、聚合文章内容、商品描述、用户昵称、新闻正文等需要模糊搜索的文本keyword关键字类型写入时不分词完整保留原始文本支持精确匹配、排序、聚合用户 ID、订单号、状态码、标签、城市、邮箱、手机号等需要精确匹配的字段long/integer整数数值类型支持范围查询、排序、聚合年龄、商品库存、订单数量、浏览量等整数数据double/float浮点数值类型支持范围查询、排序、聚合商品价格、评分、折扣率等带小数的数值数据boolean布尔值类型仅支持 true/false状态标识、是否删除、是否生效等二值场景date日期类型支持多种日期格式支持时间范围查询、排序、聚合创建时间、更新时间、订单时间、登录时间等时间字段object对象类型支持嵌套 JSON 对象适合存储一对一的关联数据用户的收货地址、商品的规格信息等单嵌套对象nested嵌套对象数组类型专门用于处理对象数组避免数组扁平化导致的查询错误订单明细、商品的多规格列表等一对多的嵌套数组场景新手高频踩坑提示text和keyword是最容易用错的类型。需要模糊搜索的字段用text需要精确匹配、排序、聚合的字段用keyword如果把需要精确匹配的字段设为text会导致 term 查询无法匹配到结果。2.2.4 分片与副本Shard ReplicaES 的分布式能力核心是通过分片与副本实现的两者的定义与作用如下主分片Primary Shard一个索引的数据会被拆分为多个主分片分散存储在集群的不同节点上实现数据的水平拆分。主分片的数量必须在创建索引时指定创建后不可修改如需调整只能重建索引。副本分片Replica Shard主分片的备份副本与主分片存储完全一致的数据用于实现故障转移主分片所在节点宕机时副本分片可升级为主分片保证数据不丢失、服务不中断同时可分担查询请求提升检索性能。副本分片的数量可动态调整无需重启服务。分片与副本的核心优势水平扩展数据分散到多个节点突破单节点的存储、性能瓶颈可通过新增节点无缝扩容高可用副本分片提供故障转移能力单个 / 多个节点宕机不影响集群正常服务性能提升查询请求可并行在多个分片上执行大幅提升海量数据的检索效率踩坑提示单节点测试环境下建议将副本数设置为 0否则副本分片无法分配到其他节点集群健康状态会变为黄色生产环境建议副本数≥1保证数据高可用。三、环境搭建3 分钟快速启动 ES 服务本文推荐使用 7.17.10 版本该版本是 7.x 的长期稳定支持版本兼容性好、文档完善适合入门学习与生产环境使用同时配套同版本的 Kibana 可视化工具方便后续操作与调试。3.1 推荐方式Docker 一键部署单节点Docker 方式无需配置本地 Java 环境一键启动避免环境依赖问题是本地学习测试的首选方案。步骤 1拉取 ES 镜像# 拉取7.17.10版本ES镜像 docker pull elasticsearch:7.17.10步骤 2创建 Docker 专属网络# 创建独立网络用于ES与Kibana容器通信 docker network create elastic步骤 3启动 ES 单节点容器# 后台启动ES容器 docker run -d \ --name elasticsearch \ --net elastic \ -p 9200:9200 \ -p 9300:9300 \ -e discovery.typesingle-node \ -e ES_JAVA_OPTS-Xms512m -Xmx512m \ elasticsearch:7.17.10步骤 4查看启动日志确认启动成功# 实时查看容器日志 docker logs -f elasticsearch日志中出现started字样即表示 ES 启动成功。核心参数说明discovery.typesingle-node单节点模式关闭集群发现机制本地测试必须添加否则会启动失败ES_JAVA_OPTS-Xms512m -Xmx512m设置 JVM 堆内存初始值与最大值建议保持一致避免堆内存动态调整的性能损耗本地测试建议不小于 512m9200端口ES 对外提供 HTTP 服务的端口所有 RESTful API 均通过该端口访问9300端口ES 集群内部节点通信的 TCP 端口3.2 配套可视化工具Kibana 安装部署Kibana 是 Elastic 官方提供的 ES 可视化管理工具提供了 Dev Tools 控制台可便捷地执行 ES 的 API 命令、查看索引数据、实现数据可视化是 ES 开发调试的必备工具版本必须与 ES 完全一致。步骤 1拉取 Kibana 镜像# 拉取与ES同版本的Kibana镜像 docker pull kibana:7.17.10步骤 2启动 Kibana 容器# 后台启动Kibana容器 docker run -d \ --name kibana \ --net elastic \ -p 5601:5601 \ -e ELASTICSEARCH_HOSTShttp://elasticsearch:9200 \ kibana:7.17.10步骤 3访问 Kibana容器启动成功后浏览器打开http://localhost:5601即可访问 Kibana后续所有 ES 的 API 操作都可以在 Kibana 的Dev Tools Console控制台中执行无需手动拼接 curl 命令。3.3 备用方式本地安装包部署如果不想使用 Docker可通过官方安装包本地部署以 Linux 系统为例步骤如下# 1. 下载ES 7.17.10安装包 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.10-linux-x86_64.tar.gz # 2. 解压安装包 tar -xzf elasticsearch-7.17.10-linux-x86_64.tar.gz # 3. 进入安装目录 cd elasticsearch-7.17.10 # 4. 前台启动ES ./bin/elasticsearch # 5. 后台启动ES生产环境使用 ./bin/elasticsearch -d注意ES 不允许使用 root 用户启动需创建普通用户执行启动命令同时需提前配置 Java 环境JDK 版本需与 ES 版本兼容。3.4 安装验证确认服务正常运行ES 启动成功后可通过 curl 命令验证服务是否正常执行以下命令curl http://localhost:9200正常返回结果如下说明 ES 服务启动成功{ name : node-1, cluster_name : docker-cluster, cluster_uuid : xxxxxx, version : { number : 7.17.10, build_flavor : default, build_type : docker, build_hash : xxxxxx, build_date : 2023-01-23T05:33:12.168997957Z, build_snapshot : false, lucene_version : 8.11.1, minimum_wire_compatibility_version : 6.8.0, minimum_index_compatibility_version : 6.0.0-beta1 }, tagline : You Know, for Search }四、ES 核心基础操作索引、文档的 CRUD 全掌握ES 的所有操作均通过 RESTful API 完成遵循 HTTP 标准方法PUT/POST/GET/DELETE以下所有命令均可直接在 Kibana Dev Tools 中执行。4.1 索引操作增、删、查索引是 ES 数据存储的顶级单元核心操作包括创建、查看、删除三类。4.1.1 创建索引创建索引时可指定主分片数、副本数等 settings 配置也可同时定义 Mapping 映射语法如下# 创建用户索引指定3个主分片1个副本分片 PUT /user_index { settings: { number_of_shards: 3, number_of_replicas: 1 } }创建成功返回结果{ acknowledged: true, shards_acknowledged: true, index: user_index }说明acknowledged: true表示索引创建成功shards_acknowledged: true表示分片已成功分配。4.1.2 查看索引支持查看所有索引列表、指定索引详情、索引配置、索引映射等常用命令如下# 1. 查看集群中所有索引的列表含健康状态、文档数、存储大小等 GET /_cat/indices?v # 2. 查看指定索引的完整详情settings mapping GET /user_index # 3. 查看指定索引的settings配置 GET /user_index/_settings # 4. 查看指定索引的mapping映射 GET /user_index/_mapping4.1.3 删除索引删除索引会同时删除该索引下的所有文档数据、配置、映射操作不可逆需谨慎执行# 删除指定索引 DELETE /user_index4.2 文档操作增、删、改、查文档是 ES 的最小数据单元核心操作包括创建、查询、更新、删除四类对应业务中的数据 CRUD。4.2.1 创建文档ES 支持两种创建文档的方式手动指定文档 ID、ES 自动生成文档 ID。方式 1手动指定文档 IDPUT 方法# 创建文档指定ID为1 PUT /user_index/_doc/1 { name: 张三, age: 25, email: zhangsanexample.com, tags: [Java, Elasticsearch] }方式 2自动生成文档 IDPOST 方法无需手动指定 IDES 会自动生成唯一的随机字符串作为文档 ID适合无唯一标识的业务数据# 创建文档自动生成ID POST /user_index/_doc { name: 李四, age: 30, email: lisiexample.com }创建成功返回结果其中_id即为自动生成的文档 ID{ _index: user_index, _id: xYz123AbCxxxxxx, _version: 1, result: created, _shards: { total: 2, successful: 1, failed: 0 }, _seq_no: 0, _primary_term: 1 }4.2.2 查询文档最基础的查询方式是根据文档 ID 精确查询语法如下# 根据文档ID查询文档详情 GET /user_index/_doc/1查询成功返回结果其中_source即为文档的原始 JSON 数据{ _index: user_index, _id: 1, _version: 1, _seq_no: 0, _primary_term: 1, found: true, _source: { name: 张三, age: 25, email: zhangsanexample.com, tags: [Java, Elasticsearch] } }4.2.3 更新文档ES 支持两种更新方式全量更新覆盖整个文档、部分更新仅修改指定字段两者有本质区别需根据业务场景选择。方式 1全量更新PUT 方法与手动指定 ID 创建文档的语法完全一致若文档 ID 已存在则执行全量覆盖文档版本号_version会自增若 ID 不存在则执行创建操作。# 全量更新ID为1的文档覆盖整个文档内容 PUT /user_index/_doc/1 { name: 张三, age: 26, email: zhangsan_newexample.com }注意全量更新会覆盖整个文档未在请求体中指定的字段会被删除比如上述示例中的tags字段会被移除需谨慎使用。方式 2部分更新POST 方法仅修改请求体中指定的字段其他字段保持不变不会删除未指定的字段是业务中最常用的更新方式语法如下# 部分更新ID为1的文档仅修改age字段 POST /user_index/_update/1 { doc: { age: 26 } }4.2.4 删除文档根据文档 ID 删除指定文档操作不可逆语法如下# 删除ID为1的文档 DELETE /user_index/_doc/14.3 批量操作提升写入 / 查询效率当需要处理大量文档时单条操作会产生大量的网络请求性能较差ES 提供了批量操作 API可在一次请求中完成多条数据的写入、更新、删除、查询大幅提升操作效率。4.3.1 批量写入 / 更新 / 删除Bulk APIBulk API 支持在一次请求中混合执行 index创建 / 覆盖、update更新、delete删除等多种操作语法有严格的格式要求核心规则如下每一个操作分为两行第一行是操作元数据操作类型、所属索引、文档 ID 等第二行是操作对应的文档数据delete 操作无需第二行每行数据必须单独占一行不能换行否则会报 JSON 解析错误批量写入示例# 批量写入3条用户数据 POST /_bulk {index:{_index:user_index,_id:1}} {name:张三,age:25,email:zhangsanexample.com,tags:[Java,Elasticsearch]} {index:{_index:user_index,_id:2}} {name:李四,age:30,email:lisiexample.com,tags:[Python,大数据]} {index:{_index:user_index,_id:3}} {name:王五,age:28,email:wangwuexample.com,tags:[Java,SpringBoot]}性能优化提示Bulk 批量操作的请求体大小建议控制在 10-15MB 之间不要过大否则会导致请求超时、节点内存压力过大反而影响写入性能。4.3.2 批量查询Multi Get API通过多个文档 ID在一次请求中批量查询多条文档数据避免多次单条查询的网络开销语法如下# 批量查询ID为1、2、3的3条文档 GET /user_index/_mget { ids: [1, 2, 3] }五、DSL 搜索语法入门解锁 ES 核心检索能力ES 的核心价值在于强大的全文检索能力而 DSLDomain Specific Language是 ES 提供的 JSON 格式的查询语言支持复杂的检索、过滤、排序、聚合操作是 ES 开发的核心技能。5.1 基础搜索单条件查询基础单条件查询是 DSL 的入门核心覆盖了业务中 80% 的基础检索场景。5.1.1 查询所有文档match_all查询指定索引下的所有文档默认返回前 10 条是最基础的查询语句# 查询user_index下的所有文档 GET /user_index/_search { query: { match_all: {} } }5.1.2 全文匹配查询match针对text类型的字段会先对查询关键词进行分词再与字段中的词条进行匹配支持全文检索、模糊匹配是 ES 全文检索的核心语法。# 全文搜索name字段中包含张三的文档 GET /user_index/_search { query: { match: { name: 张三 } } }说明比如查询关键词 张三 会被分词为 张、三只要 name 字段中包含其中任意一个词条都会被匹配到实现模糊搜索的效果。5.1.3 精确匹配查询term针对keyword、数值、日期等类型的字段不会对查询关键词进行分词直接进行完整精确匹配适合状态、ID、标签等字段的精准过滤。# 精确匹配age字段等于25的文档 GET /user_index/_search { query: { term: { age: 25 } } }新手踩坑提示term 查询不会分词若用于text类型的字段会导致无法匹配到结果比如 name 字段是text类型用 term 查询 张三只会匹配字段值完全等于 张三 且未被分词的文档大概率查询不到结果。5.1.4 范围查询range针对数值、日期类型的字段实现范围过滤支持大于、小于、大于等于、小于等于四个操作符常用参数如下gte大于等于greater than or equallte小于等于less than or equalgt大于greater thanlt小于less than示例# 查询age在25-30岁之间的文档包含25和30 GET /user_index/_search { query: { range: { age: { gte: 25, lte: 30 } } } }5.2 组合查询Bool 布尔查询多条件复合检索实际业务中绝大多数检索场景都需要多个条件组合Bool 查询是 ES 中最常用的复合查询语法支持通过四个子句组合多个查询条件实现复杂的检索逻辑四个子句如下子句逻辑含义分数计算核心适用场景must必须满足相当于 AND参与相关性分数计算匹配度越高分数越高必须匹配的核心检索条件需要根据匹配度排序should应该满足相当于 OR参与相关性分数计算匹配的子句越多分数越高可选匹配条件提升匹配度高的文档排名must_not必须不满足相当于 NOT不参与分数计算仅过滤排除不符合条件的文档filter必须满足与 must 一致不参与分数计算ES 会自动缓存结果性能远高于 must仅需要过滤、不需要根据匹配度排序的场景Bool 查询完整示例# 复合查询name字段包含张age在20岁以上不包含Python标签优先匹配age25的文档 GET /user_index/_search { query: { bool: { must: [ {match: {name: 张}} ], should: [ {term: {age: 25}} ], must_not: [ {term: {tags: Python}} ], filter: [ {range: {age: {gte: 20}}} ] } } }最佳实践对于不需要参与相关性排序的过滤条件统一放在 filter 子句中利用 ES 的缓存机制大幅提升查询性能避免全部放在 must 子句中导致的性能损耗。5.3 分页与排序5.3.1 分页查询ES 通过from和size两个参数实现分页类似 MySQL 的limit offset, sizefrom起始偏移量从 0 开始默认值为 0size每页返回的文档数量默认值为 10# 分页查询第1页每页10条数据 GET /user_index/_search { query: {match_all: {}}, from: 0, size: 10 }注意from size的最大值默认限制为 10000超过该值会报错不适合深度分页场景深度分页可使用 scroll 或 search_after 方案后续系列文章会详细讲解。5.3.2 排序ES 支持对多个字段进行排序支持正序asc、倒序desc默认按照相关性分数_score倒序排列匹配度越高排名越靠前。# 按age倒序排列age相同的按相关性分数倒序排列 GET /user_index/_search { query: {match_all: {}}, sort: [ {age: {order: desc}}, {_score: {order: desc}} ] }说明text类型的字段不支持排序如需排序需使用keyword类型的字段。5.4 高亮显示优化搜索结果展示在搜索场景中通常需要将匹配到的关键词高亮显示提升用户体验ES 通过highlight参数实现高亮功能自动给匹配到的关键词加上高亮标签默认使用em标签包裹。# 搜索name字段包含张三的文档并对name字段进行高亮显示 GET /user_index/_search { query: { match: {name: 张三} }, highlight: { fields: { name: {} } } }返回结果中会包含highlight字段示例如下{ hits: { total: { value: 1, relation: eq }, max_score: 1.3862942, hits: [ { _index: user_index, _id: 1, _score: 1.3862942, _source: { name: 张三, age: 25, email: zhangsanexample.com }, highlight: { name: [em张三/em] } } ] } }可通过pre_tags和post_tags参数自定义高亮标签比如前端使用 Vue可自定义为span classhighlight和/span。六、Mapping 映射全解析定义数据的存储与检索规则Mapping 是 ES 索引设计的核心直接决定了数据的存储方式、检索效果与查询性能生产环境中必须提前设计好 Mapping避免使用动态映射导致的线上问题。6.1 什么是 MappingMapping 定义了索引中字段的以下核心属性字段的数据类型text、keyword、integer、date 等字段是否被索引是否可被检索默认 true字段是否被存储是否单独存储默认 falsetext 类型字段的分词器规则日期类型的格式规则字段的其他高级属性比如是否忽略大小写、是否支持聚合等ES 支持两种 Mapping 模式动态映射写入文档时ES 自动根据文档内容推断字段类型无需提前定义适合快速测试场景生产环境不推荐使用静态映射显式映射创建索引时手动定义每个字段的类型与属性是生产环境的最佳实践可完全掌控字段规则避免类型推断错误6.2 创建带自定义 Mapping 的索引创建索引时可通过mappings参数定义字段的映射规则示例如下商品索引# 创建商品索引带完整的自定义Mapping PUT /product_index { settings: { number_of_shards: 3, number_of_replicas: 1 }, mappings: { properties: { title: { type: text, analyzer: ik_max_word }, price: { type: double }, stock: { type: integer }, status: { type: keyword }, tags: { type: keyword }, description: { type: text, analyzer: ik_max_word }, create_time: { type: date, format: yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis } } } }关键说明analyzer指定 text 类型字段的分词器ik_max_word是 IK 中文分词器的细粒度分词模式适合中文全文检索需提前安装与 ES 版本一致的 IK 分词器插件format指定 date 类型字段支持的日期格式用||分隔多个格式写入数据时符合任意一种格式即可被正常解析epoch_millis表示支持时间戳格式6.3 查看与修改 Mapping6.3.1 查看索引的 Mapping# 查看指定索引的完整Mapping定义 GET /product_index/_mapping6.3.2 新增字段 MappingES 支持为已有索引新增字段映射语法如下# 为product_index新增description字段 PUT /product_index/_mapping { properties: { description: { type: text, analyzer: ik_max_word } } }6.3.3 修改已有字段的 Mapping重点规则ES 不支持修改已有字段的类型或核心属性。原因字段类型决定了数据的索引方式、分词规则、倒排索引的构建方式一旦字段已有数据修改类型会导致已有的倒排索引失效无法正常检索。如果必须修改已有字段的类型唯一的解决方案是创建一个新的索引定义正确的 Mapping使用 reindex API 将原索引的数据迁移到新索引业务切换到新索引删除原索引七、实战案例从零搭建用户搜索系统前面我们已经掌握了 ES 的核心概念、基础操作与 DSL 语法接下来我们通过一个完整的用户搜索系统实战将所有知识点串联落地所有代码可直接复制复用。7.1 需求梳理我们需要实现一个用户管理系统的搜索功能核心需求如下支持按用户昵称进行全文模糊搜索支持按城市、性别、兴趣标签进行精确过滤支持按年龄范围进行过滤支持按创建时间倒序排序支持分页查询7.2 步骤 1创建用户索引含自定义 Mapping根据需求设计 Mapping核心设计思路用户名、邮箱、性别、城市、兴趣标签使用 keyword 类型支持精确匹配、过滤用户昵称使用 text 类型支持全文模糊搜索年龄integer 类型支持范围查询、排序创建时间date 类型支持时间范围查询、排序创建索引的完整命令# 创建用户搜索索引 PUT /user_index { settings: { number_of_shards: 3, number_of_replicas: 1 }, mappings: { properties: { username: {type: keyword}, nickname: {type: text}, email: {type: keyword}, age: {type: integer}, gender: {type: keyword}, city: {type: keyword}, interests: {type: keyword}, create_time: {type: date} } } }7.3 步骤 2批量导入测试数据使用 Bulk API 批量导入测试数据方便后续检索测试# 批量导入用户测试数据 POST /_bulk {index:{_index:user_index,_id:1}} {username:zhangsan,nickname:张三,email:zhangsanexample.com,age:25,gender:male,city:北京,interests:[编程,阅读],create_time:2024-01-01T10:00:00} {index:{_index:user_index,_id:2}} {username:lisi,nickname:李四,email:lisiexample.com,age:30,gender:female,city:上海,interests:[旅游,摄影],create_time:2024-01-02T11:00:00} {index:{_index:user_index,_id:3}} {username:wangwu,nickname:王五,email:wangwuexample.com,age:28,gender:male,city:北京,interests:[编程,游戏],create_time:2024-01-03T12:00:00} {index:{_index:user_index,_id:4}} {username:zhaoliu,nickname:赵六,email:zhaoliuexample.com,age:26,gender:male,city:深圳,interests:[健身,编程],create_time:2024-01-04T13:00:00} {index:{_index:user_index,_id:5}} {username:qianqi,nickname:钱七,email:qianqiexample.com,age:27,gender:female,city:北京,interests:[阅读,绘画],create_time:2024-01-05T14:00:00}7.4 步骤 3实现复杂条件检索根据需求实现完整的复合查询查询北京地区、25-30 岁、男性、兴趣包含编程的用户按创建时间倒序排列分页返回第 1 页每页 10 条数据。完整 DSL 查询语句# 用户搜索复合查询 GET /user_index/_search { query: { bool: { must: [ {term: {city: 北京}}, {term: {gender: male}}, {term: {interests: 编程}} ], filter: [ {range: {age: {gte: 25, lte: 30}}} ] } }, sort: [ {create_time: {order: desc}} ], from: 0, size: 10 }执行该查询即可返回符合所有条件的用户数据完美匹配业务需求。八、ES 常用运维命令速查日常开发与运维中以下高频命令可帮助你快速查看集群状态、定位索引问题建议收藏备用# 1. 查看集群健康状态 GET /_cat/health?v # 2. 查看集群节点列表与信息 GET /_cat/nodes?v # 3. 查看所有索引的列表与核心信息健康状态、文档数、存储大小等 GET /_cat/indices?v # 4. 查看索引的分片分配情况 GET /_cat/shards?v # 5. 查看指定索引的文档总数 GET /user_index/_count # 6. 删除索引中的所有数据保留索引结构与Mapping POST /user_index/_delete_by_query { query: {match_all: {}} } # 7. 查看集群的分片分配详情定位分片未分配问题 GET /_cluster/allocation/explain # 8. 查看ES集群的版本、节点等基础信息 GET /九、总结与系列预告本文总结本文作为 Elasticsearch 实战系列的开篇完整覆盖了 ES 入门的全流程核心知识点我们明确了 ES 的核心定位、特性与适用场景理清了 ES 与 MySQL 的差异与互补关系通过与 MySQL 类比快速掌握了索引、文档、映射、分片等 ES 核心概念避开了新手高频踩坑点完成了 ESKibana 的环境搭建提供了 Docker 一键部署与本地安装两种方案掌握了索引、文档的全量 CRUD 操作以及批量操作的高效用法打通了 DSL 搜索语法的核心知识点从单条件查询到复合布尔查询覆盖分页、排序、高亮全场景学会了 Mapping 映射的设计规则与最佳实践明确了生产环境的索引设计规范通过用户搜索系统的完整实战将所有知识点落地实现了可直接复用的业务检索能力

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价