一起来学ElasticSearch(二)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 一起来学ElasticSearch(二)

前言

目前正在出一个SpringCloud进阶系列教程,含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~


该系列默认开启Nacos 服务,还不会搭建的小伙伴可以参考往期文章~


本节主要带大家学习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。关注我,不迷路 ~

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
存储 搜索推荐 关系型数据库
为什么需要 Elasticsearch
为什么需要 Elasticsearch
21 0
|
2月前
|
自然语言处理 Java 网络安全
ElasticSearch
ElasticSearch
48 2
|
17天前
|
存储 JSON 数据可视化
Elasticsearch
Elasticsearch
28 6
|
3月前
|
搜索推荐 关系型数据库 MySQL
【Elasticsearch】初识elasticsearch
【Elasticsearch】初识elasticsearch
41 1
|
10月前
|
存储 JSON 自然语言处理
【Elasticsearch】初识elasticsearch(下)
【Elasticsearch】初识elasticsearch(下)
48 0
|
10月前
|
存储 监控 搜索推荐
【Elasticsearch】初识elasticsearch(上)
【Elasticsearch】初识elasticsearch
53 0
|
12月前
|
前端开发 Java API
一起来学ElasticSearch(十)
前言 目前正在出一个Es专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 承接上文,上节给大家讲的es聚合还有一点内容,本节给大家更完~ 本文偏实战一些,为了方便演示,本节示例沿用上节索引,好了, 废话不多说直接开整吧~ 聚合排序 我们如何在聚合结果中进行自定义字段排序呢?
|
自然语言处理 索引
如果还不会Elasticsearch这七个问题 那么你的Elasticsearch白学
如果还不会Elasticsearch这七个问题 那么你的Elasticsearch白学
56 0