ElasticSearch学习之Es索引Api操作

目录
  • Es索引Api操作
    • 创建索引
    • 索引别名
    • 添加索引别名
    • 查询索引别名
    • 删除索引别名
    • mapping
    • settings
    • 查询索引
    • 查询当前集群全部索引
    • 查询单个索引
    • 修改索引
    • 删除索引
  • 结束语

Es索引Api操作

在操作之前,先给大家简单的说下索引,在es中,默认所有数据都会建立索引,我们可以类比它是数据库中的,这里需要提示的是所有的索引index都必须要小写

创建索引

语法:

PUT /${idnexName}

运行:

PUT /test

输出:

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

这样我们就创建了test索引,建完之后,我们可以到manager也就是控制台左下角的设置图标,点击之后进入索引管理,这样我们就看到了刚刚建的索引,也可以查看的它的一些信息

索引别名

有时候,我们的索引非常多,管理起来就会变的麻烦,es为我们提供了aliases,也就是别名,我们可以简单的理解为对```index````做的标记,它可以是一对一,也可以是一对多,下面就给大家演示一下,如何添加

语法:

POST _aliases

这里给大家举个例子,比如年级,一到六年级的索引可能是class_1,class_2,class_3,class_4,class_5,class_6,我们在起别名的时候,也不是乱起的,在规范中,建议使用有意义的字段使其归为子集,比如可以统一叫做class

添加索引别名

一对一:

POST _aliases
{
 "actions":[
     {
         "add":{
             "index":"class_1",
             "alias":"class"
         }
     }
 ]
}

一对多,这里指的是一个别名对应多个索引:

POST _aliases
{
 "actions":[
     {
         "add":{
             "indices":[
                 "class_1",
                 "class_2"
             ],
             "alias":"class"
         }
     }
 ]
}

多对一,这里指的多个别名对应一个索引:

POST _aliases
{
 "actions":[
     {
         "add":{
             "index":"class",
             "aliases":[
                 "class_1",
                 "class_2"
             ]
         }
     }
 ]
}

输出:

{
  "acknowledged" : true
}

查询索引别名

语法:

GET ${indexName}/_alias

查询class_1:

GET /class_1/_alias

输出:

{
  "class_1" : {
    "aliases" : {
      "class" : { }
    }
  }
}

删除索引别名

其实很简单,只需要把add改为 remove就好了,举个例子,删除class_1的索引别名:

  • 一对一
POST _aliases
{
 "actions":[
     {
         "remove":{
             "index":"class_1",
             "alias":"class"
         }
     }
 ]
}

我们在查询一下:

{
  "class_1" : {
    "aliases" : { }
  }
}

可以看到已经被我们删掉了

一对多

POST _aliases
{
 "actions":[
     {
         "remove":{
             "indices":[
                 "class_1",
                 "class_2"
             ],
             "alias":"class"
         }
     }
 ]
}

多对一

POST _aliases
{
 "actions":[
     {
         "remove":{
             "index":"class",
             "aliases":[
                 "class_1",
                 "class_2"
             ]
         }
     }
 ]
}

这里就不带大家一一输出了,自己试着运行一下。接着我们继续看剩下的两个属性~

mapping

这个mapping是什么意思呢?字面理解好像是映射,那么它映射什么?我们以mysql为例,在创建表的时候,会对字段进行声明,比如字段名称,字段大小以及类型等等,在es中,同样会对文档的字段进行声明,包括字段类型,所否分词,是否索引,分词规则等多种属性,mapping就是提供这个作用的,所以这个大家要先理解。

es中提供了动态mapping以及静态mapping两种方式来声明一个类型中文档的字段,mapping的属性有很多,这个后边给大家整理好,本节先带大家体验一下如何操作

settings

setting属性用于设置当前索引的分片数,副本数等信息,常用的主要有:

index.number_of_shards:索引分片数

index.number_of_replicas:索引副本数

index.refresh_interval: refresh频率,默认1s。当数据对实时刷新要求不那么高时,可以适当调大改值。当值=-1时,代表不会进行refresh操作,但是请保证es的虚拟机内存足够大,不然会造成内存溢出

常见设置:

PUT class_1
{
    "settings":{
        "index":{
            "number_of_shards":3,
            "number_of_replicas":1,
            "refresh_interval":"3s"
        }
    }
}

下面我们看下完整的索引创建:

PUT class_1
{
    "aliases":{
        "class":{
        }
    },
    "mappings":{
        "properties":{
            "num":{
                "type":"long"
            },
            "name":{
                "type":"text",
                "fields":{
                    "keyword":{
                        "type":"keyword",
                        "ignore_above":256
                    }
                }
            }
        }
    },
    "settings":{
        "index":{
            "refresh_interval":"3s",
            "number_of_shards":"3",
            "number_of_replicas":"1"
        }
    }
}

有几个mapping的属性给大家说下:

  • fields这个属性的意思是·多字段属性,让一个字段拥有多个子字段类型,使得一个字段能够被多个不同的索引方式进行索引,
  • keyword 不会做分词处理。类型为 keyword 的字段只能通过精确值搜索到。类型适用于索引结构化的字段,在Elasticsearch 5.X 之后的字段类型不再支持 string,由 text 或 keyword 取代。如果仍使用 string,会给出警告。
  • ignore_above: keyword,text类型字段都可以设置ignore_above属性(默认是10) ,表示最大的字段值长度,*超出这个长度的字段将不会被索引,但是会存储,ignore_above一般设置为256,设置为30000可能会出现BulkFailureException

查询索引

上边我们讲的是创建,下面我们看下怎么查询

查询当前集群全部索引

语法:

GET _cat/indices?v

输出:

health status index                    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana_task_manager_1   RN3mjh1qRbi7wnHnZAvD1g   1   1          2            0     77.8kb         41.8kb
green  open   .apm-agent-configuration FFRPssv0SLGYNSh5_OGPeA   1   1          0            0       566b           283b
green  open   kibana_sample_data_logs  E2e-LpmvSwm62txGvhl3Ow   1   1      14074            0     21.7mb         10.7mb
green  open   class_1                  UGsT0F5nQa-p68I7NbBWqg   3   1          0            0      1.1kb           690b
green  open   .kibana_1                2bvqPg7nSiSqKahUdJuevw   1   1         51            4    284.4kb        143.1kb

查询单个索引

GET class_1

会输出一段json描述信息:

{
  "class_1" : {
    "aliases" : {
      "class" : { }
    },
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "num" : {
          "type" : "long"
        }
      }
    },
    "settings" : {
      "index" : {
        "refresh_interval" : "3s",
        "number_of_shards" : "3",
        "provided_name" : "class_1",
        "creation_date" : "1670811044703",
        "number_of_replicas" : "1",
        "uuid" : "UGsT0F5nQa-p68I7NbBWqg",
        "version" : {
          "created" : "7060299"
        }
      }
    }
  }
}

有时候索引字段非常多的时候,如果我们想查询索引的单个字段,怎么做呢?

  • 只查询mapping
GET /class_1/_mapping

输出:

{
  "class_1" : {
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "num" : {
          "type" : "long"
        }
      }
    }
  }
}
  • 只查询settings
GET /class_1/_settings

输出:

{
  "class_1" : {
    "settings" : {
      "index" : {
        "refresh_interval" : "3s",
        "number_of_shards" : "3",
        "provided_name" : "class_1",
        "creation_date" : "1670811044703",
        "number_of_replicas" : "1",
        "uuid" : "UGsT0F5nQa-p68I7NbBWqg",
        "version" : {
          "created" : "7060299"
        }
      }
    }
  }
}

修改索引

不同于mysql,你可以通过一个update把表的字段改掉,当然当你数据量很小的时候。在es中,es基于lucene,而lucene中的每个segment都具有不变性。因此每个Index一旦创建完成就不可修改。那怎么做呢?修改的另一种方式叫做数据迁移,也就是通过建立新索引,旧数据迁移到新索引的形式更新索引,在mysql中,有时在无法改变原表结构的时候,我们也是通过这种方式进行的。下面通过一个例子给大家体会下:

语法:

POST _reindex
{
 "source":{
     "index":"oldIndex"
 },
 "dest":{
     "index":"newIndex"
 }
}

首先创建class_2

PUT class_2

将class_1转移到class_2上:

POST _reindex
{
 "source":{
     "index":"class_1"
 },
 "dest":{
     "index":"class_2"
 }
}

查询之后发现class_2并没有发生什么结构变化,在这之前我们创建点数据,然后在迁移,这样看的比较明显一点,向class_1插入数据, 文档操作后边会给大家讲,先简单操作一下:

GET /class_1/_doc/
{
  "name":"一年级",
  "num": 20
}

然后再执行_reindex, 查询class_2输出:

{
  "class_2" : {
    "aliases" : {
      "class" : { }
    },
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "num" : {
          "type" : "long"
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1670811901557",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "PvK25pp6Tu6A0CiMpArRZQ",
        "version" : {
          "created" : "7060299"
        },
        "provided_name" : "class_2"
      }
    }
  }
}

我们发现,class_1的属性都被转移到了class_2

删除索引

语法:

DELETE ${indexName}

我们删除旧索引class_1

DELETE class_1

在查询,发现已经找不到class_1

想删除多个怎么办呢? 方法如下:

DELETE ${indexName}, ${indexName}

结束语

本节主要讲了索引相关的api操作,索引作为数据基石,显得尤为重要,所以大家在学习的时候,特别是创建索引,一定要多去理解和练习,好比我们在数据库中建表一样,第一步都很重要,因为这个直接影响到你后边生产的数据,所以,在下节,我会给大家好好理一下mapping

(0)

相关推荐

  • 与近日火爆的ChatGPT聊Elasticsearch源码

    目录 正文 ChatGpt对话内容 ChatGpt对话截图 正文 最近在研读Elasticsearch最新的源代码,今天突发奇想能不能和ChatGPT聊聊Elasticsearch,看看他对Elasticsearch源码有多少了解,试了后发现这货还不赖. 参考下面的对话内容和最后的对话截图. 不过美中不足的是,ChatGPT的知识截止2021年,所以当我问他一些最新源码时,他的分析还停留在以前的版本上,希望ChatGPT能紧跟时事潮流,早日实现实时迭代更新知识库. ChatGpt对话内容 我:聊

  • 详解Elasticsearch如何把一个索引变为只读

    目录 正文 设置为只读 正文 将索引设置为只读可能听起来很奇怪,但在 Elasticsearch 中执行此类操作是可能的.想象一下这样一种情况,你特别需要限制对索引的写入操作,无论是维护.业务规则还是任何其他原因.让我们学习如何将索引配置为已读以及如何撤消操作. 我们先使用如下的命令来创建一个叫做 test 的索引: PUT test/_doc/1 { "content": "I am xiaoguo from Elastic" } 设置为只读 要进行此更改,我们需

  • ElasticSearch学习之Es集群Api操作示例

    目录 前言 Es集群Api操作 _cat 获取当前集群主节点信息 获取集群当中节点信息 获取集群健康信息 获取集群索引信息 获取集群别名信息 _cluster 查询集群健康状态 查询集群统计信息 查询集群状态 结束语 前言 该系列默认开启Nacos 服务,还不会搭建的小伙伴可以参考往期文章~ 上文,我们带大家利用docker来快速搭建Es集群,如果还不会搭建的小伙伴,可以阅读上文,参考我的部署方式. 本期我们重点围绕es本身来给大家作一些讲解以及实战.虽然市面上已经有一些成熟的ORM框架可以很好

  • ElasticSearch学习之多条件组合查询验证及示例分析

    目录 多条件组合查询 bool constant_score 查询验证 & 分析 验证 分析 排序 默认排序 自定义排序 tips 单字段排序 多字段 scroll分页 初始化快照 & 快照保存10分钟 根据快照ID滚动查询 多条件组合查询 bool es中使用bool来控制多条件查询,bool查询支持以下参数: must:被查询的数据必须满足当前条件 mush_not:被查询的数据必须不满足当前条件 should:被查询的数据应该满足当前条件.should查询被用于修正查询结果的评分.需

  • ElasticSearch不停机重建索引延伸思考及优化详解

    目录 前言 需求 查询本体 查询限制 聚合查询优化 遇到问题 不停机重建索引 新建索引 切换别名指向新索引 迁移数据 查询异步迁移任务详情 调整正常索引配置 MySQL扩容 停机扩容 不停机扩容 随便聊聊 最后 前言 距离我第一次上手ES过去了一年半多了吧,当时我是从零开始花了大半年时间搭建了一整套Filebeat+Kafka+数据处理服务+Elasticsearch+Kibana+Skywalking日志收集系统.感觉还是很刺激的,毕竟同时去深度学习和运用多个刚上手的中间件对我来说是个极大的磨

  • ElasticSearch学习之Es索引Api操作

    目录 Es索引Api操作 创建索引 索引别名 添加索引别名 查询索引别名 删除索引别名 mapping settings 查询索引 查询当前集群全部索引 查询单个索引 修改索引 删除索引 结束语 Es索引Api操作 在操作之前,先给大家简单的说下索引,在es中,默认所有数据都会建立索引,我们可以类比它是数据库中的库,这里需要提示的是所有的索引index都必须要小写. 创建索引 语法: PUT /${idnexName} 运行: PUT /test 输出: { "acknowledged"

  • Elasticsearch之倒排索引及索引操作

    目录 倒排索引 一 倒排索引是什么 二 举例 三 倒排索引待解决的问题 索引操作 一 索引初始化 二 查询索引配置 三 更新索引 四 删除索引 倒排索引 一 倒排索引是什么 倒排索引源于实际应用中需要根据属性的值来查找记录,这种索引表中的每一个项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而成为倒排索引.带有倒排索引的文件我们称之为倒排索引文件,简称倒排文件 二 举例 例如有如下三个文件: 文件A:通过Python django搭建网

  • 微信小程序学习笔记之登录API与获取用户信息操作图文详解

    本文实例讲述了微信小程序学习笔记之登录API与获取用户信息操作.分享给大家供大家参考,具体如下: 前面介绍了微信小程序跳转页面.传递参数获得数据,这里来分析一下登录API与获取用户信息操作方法. [小程序登录]wx.login() app.js: App({ onLaunch: function () { // 登录 wx.login({ success: function (res) { if (res.code) { //发起网络请求 wx.request({ url: 'https://w

  • SpringBoot 如何整合 ES 实现 CRUD 操作

    本文介绍 Spring Boot 项目中整合 ElasticSearch 并实现 CRUD 操作,包括分页.滚动等功能. 之前在公司使用 ES,一直用的是前辈封装好的包,最近希望能够从原生的 Spring Boot/ES 语法角度来学习 ES 的相关技术.希望对大家有所帮助. 本文为 spring-boot-examples 系列文章节选,示例代码已上传至 https://github.com/laolunsi/spring-boot-examples 安装 ES 与可视化工具 前往 ES 官方

  • filebeat收集多个域名网站日志并存储到不同es索引库过程

    目录 1.为什么要针对不同的应用系统创建不同的索引 2.搭建web集群环境 2.1.环境准备 2.2.web集群部署 2.3.配置应用支持json格式的日志输出 3.配置filebeat实现不同日志对应不同索引 3.1.实现思路 3.2.配置filebeat不同日志使用不同索引库 3.3.在es上查看创建的索引库 3.4.在kibana上关联es索引库 3.4.1.创建www索引库 3.4.2.创建bbs索引库 3.4.3.创建blog索引库 3.4.4.所有应用索引库都一一对应上了 4.在ki

  • 分析Mysql表读写、索引等操作的sql语句效率优化问题

    上次我们说到mysql的一些sql查询方面的优化,包括查看explain执行计划,分析索引等等.今天我们分享一些 分析mysql表读写.索引等等操作的sql语句. 闲话不多说,直接上代码: 反映表的读写压力 SELECT file_name AS file, count_read, sum_number_of_bytes_read AS total_read, count_write, sum_number_of_bytes_write AS total_written, (sum_number

  • Pytorch学习之torch用法----比较操作(Comparison Ops)

    1. torch.eq(input, other, out=None) 说明: 比较元素是否相等,第二个参数可以是一个数,或者是第一个参数同类型形状的张量 参数: input(Tensor) ---- 待比较张量 other(Tenosr or float) ---- 比较张量或者数 out(Tensor,可选的) ---- 输出张量 返回值: 一个torch.ByteTensor张量,包含了每个位置的比较结果(相等为1,不等为0) >>> a = torch.Tensor([[1, 2

  • TensorFlow人工智能学习张量及高阶操作示例详解

    目录 一.张量裁剪 1.tf.maximum/minimum/clip_by_value() 2.tf.clip_by_norm() 二.张量排序 1.tf.sort/argsort() 2.tf.math.topk() 三.TensorFlow高阶操作 1.tf.where() 2.tf.scatter_nd() 3.tf.meshgrid() 一.张量裁剪 1.tf.maximum/minimum/clip_by_value() 该方法按数值裁剪,传入tensor和阈值,maximum是把数

  • Android开发学习笔记之通过API接口将LaTex数学函数表达式转化为图片形式

    本文将讲解如何通过codecogs.com和Google.com提供的API接口来将LaTeX数学函数表达式转化为图片形式.具体思路如下: (1)通过EditText获取用户输入的LaTeX数学表达式,然后对表达式格式化使之便于网络传输. (2)将格式化之后的字符串,通过Http请求发送至codecogs.com或者Google.com. (3)获取网站返回的数据流,将其转化为图片,并显示在ImageView上. 具体过程为: 1.获取并格式化LaTeX数学表达式 首先,我们在这个网站输入LaT

  • Yii框架学习笔记之应用组件操作示例

    本文实例讲述了Yii框架学习笔记之应用组件操作.分享给大家供大家参考,具体如下: 所有的组件都应声明在config/web.php //组件声明在该数组下 'components'=>array( //自定义组件1 - 函数形式 'customComponent1' => function(){ $custom = new app\components\CustomComponent\realization\CustomComponent1(); $custom->setName('谭勇

随机推荐