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.zipLinux
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}/启动与启动验证
清单将启动流程拆成三步:启动进程、设置密码、验证连通性。
启动 Elasticsearch(在解压目录内执行):
$ ./bin/elasticsearch设置密码(用于后续带认证的请求):
export ELASTIC_PASSWORD="your_password"测试是否启动成功——注意请求走的是
https,并通过--cacert指定证书、-u携带elastic内置用户凭证:curl --cacert $ES_HOME/config/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200
启动成功后返回的 JSON 样例如下(name、cluster_uuid、build_hash、build_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_version与minimum_index_compatibility_version则说明该节点可与哪些旧版本节点/索引互通,对做版本升级或集群滚动更新时有参考价值。
Elasticsearch 与 RDBMS 的对比
清单中给出一张概念映射表,帮助你用关系型数据库的思维快速对齐 Elasticsearch 的数据模型:
| RDBMS | Elasticsearch |
|---|---|
| 数据库 (database) | 索引 (index) |
| 表 (table) | 类型 (type) |
| 行 (row) | 文档 (document) |
| 列 (column) | 字段 (field) |
| 表结构 | 映射 (mapping) |
| 索引 | 全文索引 |
| SQL | 查询 DSL |
SELECT * FROM tablename | GET http://... |
UPDATE table SET | PUT http://... |
DELETE | DELETE http://... |
需要留意的是:表中「类型 (type)」对应 RDBMS 的「表」是历史概念,现代版本的 Elasticsearch 每个索引内实际只支持单一文档类型,映射直接挂在索引级(本文后续所有示例均采用索引级写法,如PUT /user_info的mappings.properties)。
HTTP 基础语法规则
Elasticsearch 的所有操作本质都是 HTTP 请求,清单给出了统一模板:
$ curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'各部分含义:
VERB:HTTP 方法,可选GET、POST、PUT、HEAD、DELETE;PROTOCOL:http或https(只有在 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/nickname用keyword(不分词、适合精确匹配与聚合),info/remark用text(分词、适合全文检索),而password设为"index": false——即该字段可被存储与返回但不建全文索引,避免密码值被分词进倒排索引,属于合理的敏感字段处理方式。清单同时注明「其他参数很多,请参考官网资料」,即本清单只固化最常用的核心参数。
删除索引
DELETE /user_infocurl -XDELETE "http://localhost:9200/user_info"判断索引是否存在
用HEAD请求(返回头而不返回主体,适合脚本判断状态码):
# 查看索引是否存在 HEAD /user_info# 查看索引是否存在 curl -XHEAD "http://localhost:9200/user_info"开启 / 关闭索引
关闭索引常用于维护、迁移或临时停止写入的场景;开启则恢复服务:
POST /user_info/_opencurl -XPOST "http://localhost:9200/user_info/_open"POST /user_info/_closecurl -XPOST "http://localhost:9200/user_info/_close"索引别名
别名让「逻辑名」与「物理索引名」解耦,是滚动更新索引(建新索引 → 建别名 → 原子切换)的常用手段。
- 添加别名:
POST /user_info/_alias/user1curl -XPOST "http://localhost:9200/user_info/_alias/user1"- 删除别名:
DELETE /user_info/_alias/user1curl -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/_mappingcurl -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/1curl -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,因此前面学过的bool、range、term、match等组合都可以直接套用于条件删除,这也是清单以「查询 DSL 即删除条件」方式组织删除章节的原因。
小结与延伸
本文完整继承了 docs/elasticsearch.md 的结构:概念定位 → 三平台下载安装(含${VERSION}占位符与 sha512 校验)→ 启动与带认证验证 → RDBMS 对照表 → HTTP 语法模板 → 索引/别名/Mapping/文档全量操作 → 条件删除。使用时记住三条主线:
- 一切皆 HTTP:
VERB + host:9200/path,?pretty美化输出,HEAD探测存在性; - 不可变项要前置规划:
number_of_shards建后不可改、mapping 只能增不能删改,这两点决定了索引设计的评审必须发生在创建之前; - 查询 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),仅供参考