ElasticSearch学习之Es索引Api操作

 更新时间:2023年01月31日 15:29:44   作者:程序员皮卡秋  
这篇文章主要为大家介绍了ElasticSearch学习之Es索引Api操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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

相关文章

  • Java多线程中线程间的通信实例详解

    Java多线程中线程间的通信实例详解

    这篇文章主要介绍了Java多线程中线程间的通信实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • MyBatis与Spring中的SqlSession详解

    MyBatis与Spring中的SqlSession详解

    在MyBatis中,你可以使用SqlSessionFactory来创建SqlSession,使用MyBatis-Spring之后,你不再需要直接使用SqlSessionFactory了,接下来通过示例代码讲解MyBatis与Spring中的SqlSession,需要的朋友可以参考下
    2024-05-05
  • Java中关于http请求获取FlexManager某设备分组监控点

    Java中关于http请求获取FlexManager某设备分组监控点

    这篇文章主要介绍了Java中关于http请求获取FlexManager某设备分组监控点,本文仅仅介绍了使用http请求获取FlexManager平台某个FBox盒子即某设备的监控点分组的分组下的所有监控点信息,需要的朋友可以参考下
    2022-10-10
  • SpringBoot上传图片到指定位置并返回URL的实现

    SpringBoot上传图片到指定位置并返回URL的实现

    本文主要介绍了SpringBoot上传图片到指定位置并返回URL,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-03-03
  • java进阶之了解SpringBoot的配置原理

    java进阶之了解SpringBoot的配置原理

    今天带大家了解SpringBoot的相关知识,文中对SpringBoot的配置原理作了非常详细的图文示例及介绍,需要的朋友可以参考下
    2021-06-06
  • Java Thread 类和Runnable 接口详解

    Java Thread 类和Runnable 接口详解

    这篇文章主要介绍了Java Thread 类和Runnable接口详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • springboot 启动时初始化数据库的步骤

    springboot 启动时初始化数据库的步骤

    这篇文章主要介绍了springboot 启动时初始化数据库的步骤,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2021-01-01
  • 浅谈Java8对字符串连接的改进正确姿势

    浅谈Java8对字符串连接的改进正确姿势

    这篇文章主要介绍了Java8:对字符串连接的改进,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java中的set集合是什么意思

    Java中的set集合是什么意思

    这篇文章主要介绍了Java中的set集合是什么意思,详细地讲解一下Collection集合中的另外一个分支——Set系列集合,需要的朋友可以参考下
    2022-05-05
  • 详解Java8中Optional的常见用法

    详解Java8中Optional的常见用法

    Opitonal是java8引入的一个新类,目的是为了解决空指针异常问题。本文将通过示例为大家详细讲讲Optional的常见用法,需要的可以参考一下
    2022-09-09

最新评论