写点什么

大数据 -169 Elasticsearch 入门到可用:索引 / 文档 CRUD 与搜索最小示例

作者:武子康
  • 2025-11-30
    山东
  • 本文字数:3694 字

    阅读完需:约 12 分钟

大数据-169 Elasticsearch 入门到可用:索引/文档 CRUD 与搜索最小示例

TL;DR

  • 场景:本地/云主机快速跑通 Elasticsearch 的索引创建、插入、查询、更新、搜索。

  • 结论:按 REST 规范与正确端点即可稳定返回;注意版本差异与安全默认项(8.x)。

  • 产出:一套可复制的最小可用流程 常见错误速查卡。



ES 简单使用

创建索引

创建 wzk_blog01 索引


http://h121.wzk.icu:9200/wzk_blog01/?pertty
复制代码


返回结果如下:


{  "acknowledged": true,  "shards_acknowledged": true,  "index": "wzk_blog01"}
复制代码


对应的截图如下图所示:


插入文档

http://h121.wzk.icu:9200/wzk_blog01/_doc/1?pretty{"id": "1", "title": "What is lucene"}
https://h121.wzk.icu:9200/wzk_blog01/_doc/1?pretty{"id": "1", "title": "What is wzk icu"}
https://h121.wzk.icu:9200/wzk_blog01/_doc/1?pretty {"id": "1", "title": "Apache Spark is a unified analytics engine for large-scale data processing"}
复制代码


返回结果如下:


{    "_index": "wzk_blog01",    "_id": "1",    "_version": 1,    "result": "created",    "_shards": {        "total": 2,        "successful": 1,        "failed": 0    },    "_seq_no": 0,    "_primary_term": 1}
复制代码

查询文档

http://h121.wzk.icu:9200/wzk_blog01/_doc/_search/1?pretty
复制代码


返回结果如下:


{  "_index": "wzk_blog01",  "_id": "1",  "_version": 3,  "_seq_no": 2,  "_primary_term": 1,  "found": true,  "_source": {    "id": "1",    "title": "Apache Spark is a unified analytics engine for large-scale data processing"  }}
复制代码


对应截图如下:


更新文档

http://h121.wzk.icu:9200/wzk_blog01/_doc/1?pretty{"id": "1", "title": " What is elasticsearch"}
复制代码


返回结果如下:


{  "_index": "wzk_blog01",  "_id": "1",  "_version": 4,  "result": "updated",  "_shards": {    "total": 2,    "successful": 1,    "failed": 0  },  "_seq_no": 3,  "_primary_term": 1}
复制代码


对应截图如下:


搜索文档

http://h121.wzk.icu:9200/wzk_blog01/_doc/_search?pretty
复制代码


返回结果如下:


{  "query": {    "match": {      "title": "What"    }  }}
复制代码


对应截图如下:


架构与概念

基本简介

Elasticsearch 是一个面向文档(document oriented)的分布式搜索和分析引擎,这意味着它能够以文档为单位存储和管理数据。与传统的行式存储不同,Elasticsearch 将每个数据实体作为一个完整的 JSON 文档进行处理和存储。例如,一个商品信息可以作为一个包含名称、价格、描述等字段的完整文档存储。


Elasticsearch 的强大之处不仅在于存储文档,更在于它能对文档内容建立高效索引(Index)。它会自动分析文档中的每个字段,建立倒排索引等数据结构,实现近乎实时的搜索能力。比如,当用户搜索"智能手机"时,Elasticsearch 可以快速返回所有包含该关键词的商品文档。


与关系型数据库相比,Elasticsearch 有许多相似概念:


  • 索引(Index)相当于 MySQL 中的数据库

  • 类型(Type,7.x 版本后已移除)类似 MySQL 的表

  • 文档(Document)对应 MySQL 中的行记录

  • 字段(Field)则对应 MySQL 中的列


例如,在电商系统中:


  • 可以创建一个名为"products"的索引

  • 每个商品作为一个文档存储

  • 文档包含 title、price、category 等字段


Elasticsearch 基于 Apache Lucene 构建,继承了其强大的全文检索能力,同时通过分布式架构解决了 Lucene 的单机限制。它支持复杂的查询功能,包括:


  1. 精确匹配查询

  2. 范围查询

  3. 模糊搜索

  4. 聚合分析

  5. 地理位置查询等


这使得 Elasticsearch 不仅适用于传统的搜索场景,也能很好地支持日志分析、商业智能等应用场景。


  • 索引(Index):类似的数据放在一个索引,非类似的数据放不同索引,一个索引也可以理解成一个关系型数据

  • 类型(type):代表 document 属于 index 中的哪个类别(type)也有一种说法一种 type 就像是数据库的表,比如 dept 表,user 表。需要注意的是,ES 每个大版本之间差别很大。

  • 映射(mapping):mapping 定义了每个字段的类型等信息,相当于关系型数据库中的表结构,常见的数据类型 text、keyword、number、array、range、boolean、date、geo_point、ip 等等类型


Elasticsearch 对比传统关系行数据库如下:


核心概念

索引 Index

一个索引就是一个拥有几分相似特征的文档的集合,比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引,一个索引由一个名字来标识(必须全部都是小写字母),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用这个名字,在一个集群中,可以定义任意多的索引。

类型 Type

在一个索引中,你可以定义一种或多种类型,一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型,比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个引擎中,在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。当然,也可以为评论数据定义另一个类型。高版本 ES 中逐渐抛弃了 Type 的概念,会有一个默认的 type:doc。

字段 Field

相当于是数据表的字段,对文档根据不同属性的进行的分类标识

映射 mapping

mapping 是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其他就是处理 ES 里面数据的一些使用规则设置也叫映射,按着最优规则处理数据对性能提高很大,因为才需要建立映射,并且需要思考如何建立映射才能对性能更好。

文档 document

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(JavaScript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。在一个 Index/type 里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在一个索引之中,文档必须被索引/赋予一个索引的 type。

近实时 NRT

Elasticsearch 是一个接近实时的搜索平台,这意味着,这索引锁一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是 1 秒以内)

Cluster

  • 集群(Cluster)一个 Elasticsearch 集群由多个节点(Node)组成,每个集群都有一个共同的集群名称作为标识。

  • 节点(Node):一个 Elasticsearch 实例就是一个 Node,一台机器可以有多个实例,正常使用下每个实例都应该会部署在不同的机器上,Elasticsearch 的配置文件中可以通过 node.master node.data 来设置节点类型

  • node.master 表示节点是否具有成为主节点的资格,true 代表的有有资格竞选主节点,false 代表的是没有资源竞选主节点

  • node.data 表示节点是否存储数据

  • Node 节点组合:主节点+数据节点(Master+Data),即有成为主节点的资格,又存储数据


node.master: truenode.data: true
复制代码


数据节点(data):节点没有成为主节点的资格,不参与选举,只会存储数据:


node.master: falsenode.data: true
复制代码


客户端节点(client):不会成为主节点,也不会存储数据,主要是针对海量请求的时候可以进行负载均衡:


node.master: falsenode.data: false
复制代码


  • 分片:每个索引由一个或者多个分片,每个分片存储不同的数据,分片可以主分片(primary shard)和复制分片(replica shard),复制分片是主分片的拷贝,默认每个主分片有一个复制分片,每个索引的复制分片的数量可以动态的调整,复制分片从不与它的主分片在同一个节点上。

  • 副本:这里指主分片的副本分片(主分片的拷贝)。提高恢复能力,当主分片挂掉的时候,某个复制分片可以变成主分片。提高性能,get 和 search 请求既可以由主分片又可以由复制分片处理


注意:每个索引可以被分成多个分片,一个索引页可以被复制 0 次(意思是没有复制)或多次,一旦复制了,每个索引有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态的改变复制的数量,但你事后不能改变分片的数量。默认情况下,Elasticsearch 中的每个索引被分片 5 个和 1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有 5 个主分片和另外 5 个复制分片(1 个完全拷贝),这样的话每个索引总共 10 个分片。

错误速查

其他系列

🚀 AI 篇持续更新中(长期更新)

AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!AI 研究-127 Qwen2.5-Omni 深解:Thinker-Talker 双核、TMRoPE 与流式语音🔗 AI模块直达链接

💻 Java 篇持续更新中(长期更新)

Java-174 FastFDS 从单机到分布式文件存储:实战与架构取舍 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务已完结,Dubbo 已完结,MySQL 已完结,MongoDB 已完结,Neo4j 已完结,FastDFS 正在更新,深入浅出助你打牢基础!🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解🔗 大数据模块直达链接

发布于: 刚刚阅读数: 3
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-169 Elasticsearch 入门到可用:索引/文档 CRUD 与搜索最小示例_Java_武子康_InfoQ写作社区