news 2026/9/14 16:10:28

Quick Reference 中的 Elasticsearch 操作实战:从安装启动到索引、Mapping 与文档查询的完整速查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Quick Reference 中的 Elasticsearch 操作实战:从安装启动到索引、Mapping 与文档查询的完整速查

Quick Reference 中的 Elasticsearch 操作实战:从安装启动到索引、Mapping 与文档查询的完整速查

【免费下载链接】reference面向开发者的技术速查清单(Cheat Sheets)集合,整理常见技术、工具与开发流程,帮助快速查阅关键信息,提高开发效率。项目地址: https://gitcode.com/GitHub_Trending/referen/reference

本文基于速查清单仓库(Quick Reference)中的 Elasticsearch 备忘清单 展开,系统梳理 Elasticsearch 的下载安装与启动验证、HTTP 请求基础语法、索引/Mapping/文档的增删改查全套操作,以及 DSL 与 curl 两种等价写法。读完本文,你可以脱离 GUI 客户端,仅用curl命令行完成索引创建、字段映射维护、条件/范围/分页查询和按条件批量删除等日常运维与开发任务,并在遇到细节差异时对照本仓库清单原文快速核对。

Elasticsearch 是什么

Elasticsearch 是一个基于 Lucene 库构建的搜索引擎,提供分布式、多租户的全文搜索能力,通过 HTTP Web 接口操作,使用无模式(schema-free)的 JSON 文档。本清单收录于 Quick Reference 仓库 的「数据库」分类下(与 MySQL、PostgreSQL、Redis 等并列),其品牌标识见 assets/elasticsearch.svg。

清单原文给出的定位非常务实:它是围绕「命令行可复制即用」整理的一份备忘,所有操作均给出 DSL(HTTP 语法)与curl两种形态,因此本文也遵循这一结构——先给出 DSL,再给出等价的 curl 命令,方便直接粘贴执行。

下载安装:${VERSION}占位符与三大平台

清单中所有下载链接都使用${VERSION}作为版本占位符,执行前必须替换为你要安装的具体版本号。原文特别提示:

官方包有的功能只能试用,完整功能需要付费,请仔细阅读官网文档。

这是使用 Elastic 官方发行版的重要前提:不同订阅层级(Basic/Default 等)决定了哪些功能(如安全、监控、部分 X-Pack 能力)可用。

Windows

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-windows-x86_64.zip

Linux

Linux 侧清单给出的流程是「下载 → 下载校验文件 → 校验 → 解压 → 进入目录」,校验步骤可以防止下载不完整或包被篡改:

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-linux-x86_64.tar.gz $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-linux-x86_64.tar.gz.sha512 $ shasum -a 512 -c elasticsearch-${VERSION}-linux-x86_64.tar.gz.sha512 $ tar -xzf elasticsearch-${VERSION}-linux-x86_64.tar.gz $ cd elasticsearch-${VERSION}/

macOS

macOS 侧等价流程(用curl下载,并把.sha512校验文件通过管道直接交给shasum校验):

$ curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-darwin-x86_64.tar.gz $ curl https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-darwin-x86_64.tar.gz.sha512 | shasum -a 512 -c - $ tar -xzf elasticsearch-${VERSION}-darwin-x86_64.tar.gz $ cd elasticsearch-${VERSION}/

启动与启动验证

清单将启动流程拆成三步:启动进程、设置密码、验证连通性。

  1. 启动 Elasticsearch(在解压目录内执行):

    $ ./bin/elasticsearch
  2. 设置密码(用于后续带认证的请求):

    export ELASTIC_PASSWORD="your_password"
  3. 测试是否启动成功——注意请求走的是https,并通过--cacert指定证书、-u携带elastic内置用户凭证:

    curl --cacert $ES_HOME/config/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200

启动成功后返回的 JSON 样例如下(namecluster_uuidbuild_hashbuild_date等字段会随实例不同而变化):

{ "name" : "Cp8oag6", "cluster_name" : "elasticsearch", "cluster_uuid" : "AT69_T_DTp-1qgIJlatQqA", "version" : { "number" : "${VERSION}", "build_type" : "tar", "build_hash" : "f27399d", "build_flavor" : "default", "build_date" : "2016-03-30T09:51:41.449Z", "build_snapshot" : false, "lucene_version" : "9.10.0", "minimum_wire_compatibility_version" : "1.2.3", "minimum_index_compatibility_version" : "1.2.3" }, "tagline" : "You Know, for Search" }

从返回结构中可以看出几个关键字段:cluster_name/cluster_uuid标识集群,version.build_type表明这是 tar 包安装(与前面「解压运行」的安装方式呼应),lucene_version反映其底层的 Lucene 版本,minimum_wire_compatibility_versionminimum_index_compatibility_version则说明该节点可与哪些旧版本节点/索引互通,对做版本升级或集群滚动更新时有参考价值。

Elasticsearch 与 RDBMS 的对比

清单中给出一张概念映射表,帮助你用关系型数据库的思维快速对齐 Elasticsearch 的数据模型:

RDBMSElasticsearch
数据库 (database)索引 (index)
表 (table)类型 (type)
行 (row)文档 (document)
列 (column)字段 (field)
表结构映射 (mapping)
索引全文索引
SQL查询 DSL
SELECT * FROM tablenameGET http://...
UPDATE table SETPUT http://...
DELETEDELETE http://...

需要留意的是:表中「类型 (type)」对应 RDBMS 的「表」是历史概念,现代版本的 Elasticsearch 每个索引内实际只支持单一文档类型,映射直接挂在索引级(本文后续所有示例均采用索引级写法,如PUT /user_infomappings.properties)。

HTTP 基础语法规则

Elasticsearch 的所有操作本质都是 HTTP 请求,清单给出了统一模板:

$ curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

各部分含义:

  • VERB:HTTP 方法,可选GETPOSTPUTHEADDELETE
  • PROTOCOLhttphttps(只有在 Elasticsearch 前面有 https 代理的时候可用);
  • HOST:集群中任何一个节点的主机名,本地即localhost
  • PORT:Elasticsearch HTTP 服务端口,默认为9200
  • PATH:API 路径,例如_count返回集群中文档数量;路径可包含多个组件,例如_cluster/stats_nodes/stats/jvm
  • QUERY_STRING:可选查询参数,例如?pretty使返回的 JSON 更美观易读;
  • BODY:JSON 格式请求主体(如果请求需要的话)。

从 curl 备忘清单 中也能看到这套语法在实战中的延伸写法,例如把_cluster/nodes之类的响应通过python -m json.tool做格式化,与本清单的?pretty参数殊途同归。

索引操作

创建索引

统一的 API 前缀:

http://localhost:9200/

DSL 写法(以user_info索引为例,1 主分片、1 副本,并给出完整字段映射):

PUT /user_info { "settings": { "number_of_replicas": 1, "number_of_shards": 1 }, "mappings": { "properties": { "id": { "type": "long", "index": true }, "username": { "type": "keyword", "index": true }, "nickname": { "type": "keyword", "index": true }, "password": { "type": "keyword", "index": false }, "age": { "type": "integer", "index": true }, "info": { "type": "text", "index": true }, "remark": { "type": "text", "index": true } } } }

等价 curl 命令:

curl -XPUT "http://localhost:9200/user_info" -H 'Content-Type: application/json' -d'{ "settings": { "number_of_replicas": 1, "number_of_shards": 1 }, "mappings": { "properties": { "id": { "type": "long", "index": true }, "username": { "type": "keyword", "index": true }, "nickname": { "type": "keyword", "index": true }, "password": { "type": "keyword", "index": false }, "age": { "type": "integer", "index": true }, "info": { "type": "text", "index": true }, "remark": { "type": "text", "index": true } } } }'

参数说明:

  • settings:索引级设置;
  • number_of_shards:每个索引的主分片数。索引一旦创建后无法修改此配置,因此建索引前应根据数据量预估;
  • number_of_replicas:每个主分片的副本数,可随时修改,用于在写入吞吐与查询可用性/吞吐之间权衡;
  • mappings:索引映射定义;
  • properties:字段定义,键为字段名,值中type指定字段类型。

从示例映射本身可以读出几处设计取舍,值得注意:username/nicknamekeyword(不分词、适合精确匹配与聚合),info/remarktext(分词、适合全文检索),而password设为"index": false——即该字段可被存储与返回但不建全文索引,避免密码值被分词进倒排索引,属于合理的敏感字段处理方式。清单同时注明「其他参数很多,请参考官网资料」,即本清单只固化最常用的核心参数。

删除索引

DELETE /user_info
curl -XDELETE "http://localhost:9200/user_info"

判断索引是否存在

HEAD请求(返回头而不返回主体,适合脚本判断状态码):

# 查看索引是否存在 HEAD /user_info
# 查看索引是否存在 curl -XHEAD "http://localhost:9200/user_info"

开启 / 关闭索引

关闭索引常用于维护、迁移或临时停止写入的场景;开启则恢复服务:

POST /user_info/_open
curl -XPOST "http://localhost:9200/user_info/_open"
POST /user_info/_close
curl -XPOST "http://localhost:9200/user_info/_close"

索引别名

别名让「逻辑名」与「物理索引名」解耦,是滚动更新索引(建新索引 → 建别名 → 原子切换)的常用手段。

  • 添加别名:
POST /user_info/_alias/user1
curl -XPOST "http://localhost:9200/user_info/_alias/user1"
  • 删除别名:
DELETE /user_info/_alias/user1
curl -XDELETE "http://localhost:9200/user_info/_alias/user1"
  • 查看别名(DSL 写的是GET /_alias/user1):
curl -XGET "http://localhost:9200/_alias/useraa"

核对提示:清单原文中「查看别名」的 DSL 与 curl 示例里的别名不一致(DSL 为user1,curl 为useraa),实际执行时请统一为当前真实存在的别名。

Mapping 操作(类似修改数据库中列的操作)

查看 mapping

GET /user_info/_mapping
curl -XGET "http://localhost:9200/user_info/_mapping"

新增 mapping

给已有索引追加新字段sex

PUT /user_info/_mapping { "properties":{ "sex":{ "type":"keyword" } } }
curl -XPUT "http://localhost:9200/user_info/_mapping" -H 'Content-Type: application/json' -d'{ "properties":{ "sex":{ "type":"keyword" } } }'

注意:字段映射只能增加,不能更改或删除已有字段(类型变更通常需要重建索引并迁移数据)。这条约束在原文中以显式「注意」标出,是 Mapping 维护中最重要的规则之一。

文档操作

添加文档

指定_doc/1即写入文档 ID 为1的文档:

POST /user_info/_doc/1 { "id":1, "username":"username", "password":"123456", "nickname":"nickname", "age":18, "info":"一些个人相关的介绍", "remark":"备注信息", "sex":"男" }
curl -XPOST "http://localhost:9200/user_info/_doc/1" -H 'Content-Type: application/json' -d'{ "id":1, "username":"username", "password":"123456", "nickname":"nickname", "age":18, "info":"一些个人相关的介绍", "remark":"备注信息", "sex":"男" }'

查询索引下所有文档

类似select * from user_info;

GET /user_info/_search { "query": { "match_all": {} } }
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "match_all": {} } }'

通过 id 查询文档

类似select * from user_info where id = 1;

GET /user_info/_doc/1
curl -XGET "http://localhost:9200/user_info/_doc/1"

模糊查找(全文匹配)

类似select * from user_info where info like '%人%';match会对text字段分词后匹配:

GET /user_info/_search { "query": { "match": { "info": "人" } } }

通过条件查询文档(term 精确匹配)

类似select * from user_info where username = 'username';term针对keyword类型做不分词精确匹配:

GET /user_info/_search { "query": { "bool": { "must": [ { "term": { "username": "username" } } ] } } }
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "term": { "username": "username" } } ] } } }'

范围查找

类似select * from user_info where age between 18 and 30;(注意gt/lt为开区间,严格大于/小于):

GET /user_info/_search { "query": { "range": { "age": { "gt": 18, "lt": 30 } } } }
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "range": { "age": { "gt": 18, "lt": 30 } } } }'

and 查询(bool.must)

类似select * from user_info where age > 18 and sex = '男';bool查询的must子句要求所有条件都满足:

GET /user_info/_search { "query": { "bool": { "must": [ { "range": { "age": { "gt": 18 } } }, { "term": { "sex": "男" } } ] } } }
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "range": { "age": { "gt": 17 } } }, { "term": { "sex": "男" } } ] } } }'

核对提示:原文此处 DSL 与 curl 的阈值不一致(DSL 为gt: 18,curl 为gt: 17),执行时请以 DSL 为准或按需统一。

or 查询(bool.should)

类似select * from user_info where age > 18 or sex = '男';should表达「满足其一」:

GET /user_info/_search { "query": { "bool": { "should": [ { "range": { "age": { "gt": 18 } } }, { "term": { "sex": "男" } } ] } } }
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "should": [ { "range": { "age": { "gt": 18 } } }, { "term": { "sex": "男" } } ] } } }'

limit 查找(控制返回条数)

类似select * from user_info limit 10;,用size控制返回条数:

GET /user_info/_search { "size": 10, "query": { "match_all": {} } }
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "size": 1, "query": { "match_all": {} } }'

(原文 DSL 为"size": 10,curl 示例为"size": 1,两者语义相同,按实际需要取值。)

limit offset 查找(分页)

类似select * from user_info limit 0,10;,用from+size组合实现偏移分页:

GET /user_info/_search { "size": 2, "from": 1, "query": { "match_all": {} } }
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "size": 2, "from": 1, "query": { "match_all": {} } }'

参数说明(原文参数解释与示例数值不同,这里按原文语义整理):

  • size:想要返回的结果数量(原文示例语义为 10 条);
  • from:从结果集第几条开始返回,偏移从 0 开始,例如from: 1即跳过第 1 条、从第 2 条开始;
  • query: {"match_all": {}}:无特定条件、仅取分页结果时的匹配所有文档查询。

实践提醒:from + size深度分页在大数据量下开销较高,生产环境深度翻页可考虑滚动或搜索上下文方案,此处清单聚焦的是基础分页语义。

删除文档

删除指定 id

类似delete from user_info where id = 3;

# 删除文档 DELETE /user_info/_doc/3
# 删除文档 curl -XDELETE "http://localhost:9200/user_info/_doc/3"

按条件删除(delete_by_query)

类似delete from user_info where age > 18;。这是清单「删除文档」部分的关键补充:Elasticsearch 不支持直接写DELETE WHERE,条件删除统一走_delete_by_queryAPI:

POST /user_info/_delete_by_query { "query": { "range": { "age": { "gt": 18 } } } }
curl -XPOST "http://localhost:9200/user_info/_delete_by_query" -H 'Content-Type: application/json' -d'{"query":{"range":{"age":{"gt":18}}}}'

_delete_by_query复用的是与_search相同的查询 DSL,因此前面学过的boolrangetermmatch等组合都可以直接套用于条件删除,这也是清单以「查询 DSL 即删除条件」方式组织删除章节的原因。

小结与延伸

本文完整继承了 docs/elasticsearch.md 的结构:概念定位 → 三平台下载安装(含${VERSION}占位符与 sha512 校验)→ 启动与带认证验证 → RDBMS 对照表 → HTTP 语法模板 → 索引/别名/Mapping/文档全量操作 → 条件删除。使用时记住三条主线:

  1. 一切皆 HTTP:VERB + host:9200/path?pretty美化输出,HEAD探测存在性;
  2. 不可变项要前置规划:number_of_shards建后不可改、mapping 只能增不能删改,这两点决定了索引设计的评审必须发生在创建之前;
  3. 查询 DSL 与删除 DSL 同源:_delete_by_query_search共用查询语法,学会一套查询即可覆盖「查 + 条件删」两大场景。

如需更完整的参数与 API 细节,清单原文明确建议参考 Elasticsearch 官方文档;同时本仓库 README 的「数据库」分类还收录了 MySQL、MongoDB、Redis、Neo4j、SQLite 等姊妹速查表,配合 curl 清单一起使用,可以快速搭建一套纯命令行的数据存储运维手册。

【免费下载链接】reference面向开发者的技术速查清单(Cheat Sheets)集合,整理常见技术、工具与开发流程,帮助快速查阅关键信息,提高开发效率。项目地址: https://gitcode.com/GitHub_Trending/referen/reference

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 16:10:05

高考英语高效备考:资源选择与使用策略

1. 高三英语资源合集概述作为一名经历过高考的英语教师&#xff0c;我深知高三阶段英语学习资源的重要性。高三英语资源合集是针对高考英语备考的系统性学习材料集合&#xff0c;包含词汇、语法、阅读、写作、听力等全方位内容。这类资源通常由经验丰富的教师团队整理&#xff…

作者头像 李华
网站建设 2026/9/14 16:08:48

基于YOLOv8的麻将识别系统开发与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 16:07:28

短信技术解析:从基础协议到现代应用实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 16:04:29

QMK Converters 转换器完全指南:为键盘无缝更换兼容主控

QMK Converters 转换器完全指南&#xff1a;为键盘无缝更换兼容主控 【免费下载链接】qmk_firmware Open-source keyboard firmware for Atmel AVR and Arm USB families 项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware 导读 本指南基于 QMK Firmware…

作者头像 李华
网站建设 2026/9/14 16:03:25

克米设计APP手机版Discuz模板解析:CSS结构与移动端适配

简介&#xff1a;这是一套面向Discuz论坛站长与开发者的移动端模板源码包&#xff0c;旨在解决论坛在手机端体验不佳的问题&#xff0c;采用克米设计的APP风格界面&#xff0c;融合响应式布局、清新配色与流畅交互&#xff0c;可快速搭建适合移动设备的社区平台。压缩包共2000个…

作者头像 李华