草庐IT

【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解

素人岳 2025-07-09 原文

文章目录


概念

es中有三个概念要清楚,分别为

  • 索引、映射和文档(不用死记硬背,大概有个印象就可以)

    1. 索引可理解为MySQL数据库;
    2. 映射可理解为MySQL的表结构;
    3. 文档可理解为MySQL表中的每行数据

静态映射和动态映射

  • 上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;

  • 但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就是动态映射

  • 静态映射是指,在创建文档时,手动添加文档映射,类似于MySQL创建表结构一样;

  • 下面为es根据插入的数据推断出的字段类型规则:

下面为针对索引、文档以及映射编写的CRUD

索引相关操作

创建索引

  • json中指定了分片和副本;
PUT /{索引名称}

{
    "settings": {
        "number_of_shards": 3, // 分片数量
        "number_of_replicas": 1 // 副本数量
    }
}

响应

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "blog"
}

更新副本

  • Elasticsearch 允许更新索引副本数量
PUT /{索引名字}/_settings
{
    "number_of_replicas": 2
}

查看索引

  • 查看索引有多个命令
GET /{索引名字}
GET /{索引名字}/_settings
GET /{索引名字1},{索引名字} // 多个索引
GET /_all/_settings // 所有索引

删除索引

  • 删除索引之后,索引中的文档就会不存在,建议删除之前备份;
DELETE /{索引名字}

索引的打开与关闭

  • Elasticsearch 中,索引是有打开和关闭状态的,关闭的索引,几乎不占用资源;
  • 已经关闭的索引不可以进行读写;
POST /{索引名字}/_close	 // 关闭索引
POST /{索引名字}/_open 	// 开启索引
POST /_all/_close	 // 打开所有
POST /_all/_open 	// 关闭所有

收缩索引

  • 一个索引的分片初始化以后是无法再做修改的,但可以使用shrink index AP提供的缩小索引分片数机制;

索引别名

  • 索引别名就是给一个索引或者多个索引起的另一个名字,下面为给索引blog取别名为blog1;
POST /_aliases
{
    "actions": [
        {
            "add": {
                "index": "blog",
                "alias": "blog1"
            }
        }
    ]
}

查询索引别名

GET /_aliases

返回结果

{
    ".kibana_1": {
        "aliases": {
            ".kibana": {}
        }
    },
    "blog": {
        "aliases": {
            "blog1": {}
        }
    }
}

文档相关操作

新建文档

  • id为空,则系统自动生成
POST /{索引名称}/{文档名称}/{id}
{
    "title": "我是标题",
    "content": "我是内容"
}

响应

{
    "_index": "blog", // 所在索引
    "_type": "article", // 所在文档
    "_id": "otl3EYIBIy80TGr00MPx", // 随机id
    "_version": 1, // 版本号
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

查询文档

GET/{索引名称}/{文档名称}/{id}

响应

{
    "_index": "blog",
    "_type": "article",
    "_id": "otl3EYIBIy80TGr00MPx",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "title": "我是标题",
        "content": "我是内容"
    }
}

更新文档

  • 实际上 Elasticsearch 并不在原有的基础上进行更新;
  • 新增文档没有什么区别的,elasticSearch 会判断id是否存在,如果存在,即更新,否则新增;
  • 更新之后,_version版本号也会自增+1;
POST /blog/article/otl3EYIBIy80TGr00MPx
{
    "title": "我是标题1",
    "content": "我是内容1"
}

删除文档

DELETE /blog/article/otl3EYIBIy80TGr00MPx

映射相关操作

查询文档映射

  • 如果对es检索依赖比较严重的话,那么并不推荐开启动态映射;
GET /{索引}/_mappings

响应(此映射为es根据文档创建的动态映射)

{
    "blog": {
        "mappings": {
            "properties": {
                "content": {
                    "type": "text", // text类型
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "title": {
                    "type": "text", // text类型
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

创建静态映射

PUT /{索引名称}
{
    "properties":{
        "content":{
            "type":"text",
            "fields":{
                "keyword":{
                    "type":"keyword",
                    "ignore_above":256
                }
            }
        },
        "title":{
            "type":"text",
            "fields":{
                "keyword":{
                    "type":"keyword",
                    "ignore_above":256
                }
            }
        }
    }
}

响应

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "user"
}

创建索引并添加映射

PUT /{索引名称}
{
  "mappings": {
    "properties": {
      "name":{
      "type":"keyword"
      },
      "age":{
        "type":"integer"
      },
      "address":{
        "type":"text"
      }
    }
  }
}

有关【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  6. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  7. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  8. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  9. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  10. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

随机推荐