开发者

ElasticSearch学习之Es索引Api操作

开发者 https://www.devze.com 2023-02-01 10:39 出处:网络 作者: 程序员皮卡秋
目录Es索引Api操作创建索引索引别名添加索引别名查询索引别名删除索引别名mappingsettings查询索引查询当前集群全部索引查询单个索引修改索引删除索引结束语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":[
     javascript    {
             "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为例,在创建表的时候开发者_Js入门,会对字段进行声明,比如字段名称,字段大小以及类型等等,在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_1javascript                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" : "1670811044php703",
            "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_shajsrds" : "1",
            "number_of_replicas" : "1",
            "uuid" : "PvK25pp6Tu6A0CiMpArRZQ",
            "version" : {
              "createdjavascript" : "7060299"
            },
            "provided_name" : "class_2"
          }
        }
      }
    }
    

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

    删除索引

    语法:

    DELETE ${indexName}
    

    我们删除旧索引class_1

    DELETE class_1
    

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

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

    DELETE ${indexName}, ${indexName}
    

    结束语

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

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号