当前位置:主页 > java教程 > ElasticSearch Es索引Api操作

ElasticSearch学习之Es索引Api操作

发布:2023-04-18 10:50:02 59


为找教程的网友们整理了相关的编程文章,网友满以彤根据主题投稿了本篇教程内容,涉及到ElasticSearch Es索引Api操作、Es索引Api操作、ElasticSearch Es索引Api操作相关内容,已被121网友关注,相关难点技巧可以阅读下方的电子资料。

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


参考资料

相关文章

网友讨论