• ElasticSearch的常规增删改查操作


    1、Restful简介

    RESTFul:Representational State Transfer,中文意思:表现层状态转化。变现层指的是资源的表现层,这里的资源是指网络上的信息,比如一张图片,一段文本,一步电影,那么每个资源在网络上都有一个标识,可以理解为一个ID,每个资源都有一个ID去表示它,这个ID就称之为URL。当我们给了这个资源一个地址后,比如我们经常说的URL,我们就能访问这个资源。

    表现层状态转化:

    我们平时访问一个网站,其实就是客户端和服务端的一种互动过程,有了互动,这个数据的状态肯定会发生改变。Elasticsearch默认走的是http协议,而http协议它是一种无状态的协议,无状态就是指服务端它不会记录客户端的所有信息和操作,客户端必须每次带上自己的状态去请求服务器。因此,如果客户端想要操作这个服务器,必须通过某些手段,才能让服务器发生状态转化。而这种转化是建立在表现层之上的,所以说这就表现层的状态转化。

    转化手段:

    1. GET:用来获取资源
    2. POST:用来创建资源(也可以用来更新资源)
    3. PUT:用来更新资源
    4. DELETE:用来删除资源

    我们对ES的所有操作,都被封装成了RestAPI,所以我们只要发送请求就行了。

    2、查看ES的基本信息

    查看所有结点:

    GET _cat/nodes
    

    查看ES健康状况

    GET _cat/health
    
    • Green:主分片与副本都正常分配
    • Yellow:主分片全部正常分配,有副本分片未能正常分配
    • Red:有主分片未能分配

    查看主节点:

    GET _cat/master
    

    查看所有索引[类似于show databases]

    GET _cat/indices
    

    3、索引操作

    [3.1]、创建并显示指定索引字段的类型

    创建名为user的索引与对应映射信息。

    PUT /user
    {
      "mappings": {
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "address": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "remark": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "age": {
            "type": "long"
          },
          "salary": {
            "type": "double"
          },
          "birthDate": {
            "type": "date",
            "format": "yyyy-MM-dd"
          }
        }
      }
    }
    

    [3.2]、通过创建文档的方式自动映射字段的类型,当索引不存在的时候会自动创建并且字段类型自动根据值进行映射。

    格式:PUT /索引名/类型名/文档id

    以前的写法是:{index}/{type}/{id},例如:user/_doc/1

    现在的写法是:{index}/_doc/{id},例如:user/_doc/1

    由于在ES7中将type概念移除了,所以现在建议直接写成_doc,当然你硬要指定type类型也行,只是ES是给出一个警告:#! [types removal] Specifying types in document index requests is deprecated, use the typeless endpoints instead (/{index}/_doc/{id}, /{index}/_doc, or /{index}/_create/{id}).

    PUT /user/_doc/1
    {
      "name":"小白学es",
      "age":3
    }
    

    如果索引原本中没有的字段,这是也会自动加上并且映射类型,比如之前是没有sex字段的:

    PUT /user/_doc/1
    {
      "name":"小白学es",
      "age":18,
      "sex":"男"
    }
    

    [3.3]、查看索引

    GET /user
    

    [3.4]、删除索引

    DELETE /user
    

    4、文档操作

    [4.1]、增加文档信息

    在索引 user 中增加一条文档信息。如果不指定ID,那么ES会自动生成ID

    POST /user/_doc
    {
      "name": "张三",
      "age": 29,
      "salary": 100,
      "address": "北京市",
      "remark": "来自中国北京市的张先生",
      "birthDate": "1990-01-10"
    }
    

    image

    增加文档时指定ID:

    POST /user/_doc/1
    {
        "name": "张三",
        "age": 29,
        "salary": 100,
        "address": "北京市",
        "remark": "来自中国北京市的张先生",
        "birthDate": "1990-01-10"
    }
    

    [4.2]、更新文档信息

    更新文档信息可以使用PUT和POST来请求,TODO 待确认? PUT修改:全量字段更新,而POST 修改:指定字段更新(推荐使用)

    使用PUT方式更新之前创建的 id=1 的文档信息。

    PUT /user/_doc/1
    {
      "name": "李四"
    }
    

    可以发现这里只更新了name字段,没有更新其它的字段,所以其它字段默认会填充空值。

    image


    使用POST请求修改文档:

    首先将没个字段的值都初始化

    POST /user/_doc/1
    {
        "name": "张三",
        "age": 29,
        "salary": 100,
        "address": "北京市",
        "remark": "来自中国北京市的张先生",
        "birthDate": "1990-01-10"
    }
    

    然后再用POST请求执行修改文档操作:

    POST方式第一种更新:

    POST /user/_update/1/
    {
      "doc": {
        "name": "王五"
      }
    }
    

    第一次结果:

    "_version": 5,
    "result": "updated"
    

    第二次结果:

    "_version": 5,
    "result": "noop"
    

    使用这种更新操作进行重复更新时,若数据与原先一致,则不进行任何操作。返回的结果是:"result": "noop",而不是"result" : "updated"


    POST方式第二种更新:

    POST /user/_doc/1
    {
        "name":"赵六"
    }
    

    第一次结果:

    "_version": 6,
    "result": "updated"
    

    第二次结果:

    "_version": 7,
    "result": "updated"
    

    使用第二种更新操作时[即不带_update],无论是否重复更新,数据是否一致,都会进行更新,version版本相应增加。因此若使用PUT方式,结果也一致。


    [4.3]、获取文档信息

    获取 user的索引 id=1 的文档信息。

    GET /user/_doc/1
    

    [4.4]、删除文档信息

    删除之前创建的 id=1 的文档信息。

    DELETE /user/_doc/1
    

    5、批量操作

    有些情况下可以通过批量操作以减少网络请求。如:批量查询、批量插入数据等。

    [5.1]、批量查询

    # 注:POST user/_doc/_mget 类型没写则重写默认的类型,即_doc,如果写了ES会给一个系统警告,不过不影响结果
    POST user/_mget
    {
      "ids" : [ "1", "mT245YABxusAxYeD-gUz" ]
    }
    

    image

    在Elasticsearch中,支持批量的插入、修改、删除操作,都是通过_bulk的api完成的。
    请求格式如下:

    { action: { metadata }}
    { request body    }
    { action: { metadata }}
    { request body    }
    ...
    

    注意:请求格式不同寻常,必须按照这种指定格式,如果不小心换行了,那么不好意思,执行报错。


    [5.2]、单条插入数据:

    POST user/_doc
    {"name":"周八","address":"广东省广州市花都区","remark":"公司底层码农员工","age":32,"salary":5000,"birthDate":"1987-09-26"}
    

    [5.3]、批量插入数据:

    POST _bulk
    {"create":{"_index":"user","_id":2001}}
    {"name":"刘一","address":"广东省广州市花都区","remark":"公司底层码农员工","age":30,"salary":3000,"birthDate":"1989-11-11"}
    {"create":{"_index":"user","_id":2002}}
    {"name":"陈二","address":"广东省广州市花都区","remark":"公司底层码农员工","age":27,"salary":7900,"birthDate":"1992-01-25"}
    {"create":{"_index":"user","_id":2003}}
    {"name":"张三","address":"广东省广州市花都区","remark":"公司底层码农员工","age":28,"salary":8800,"birthDate":"1991-10-05"}
    {"create":{"_index":"user","_id":2004}}
    {"name":"李四","address":"广东省广州市花都区","remark":"公司底层码农员工","age":26,"salary":9000,"birthDate":"1993-08-18"}
    {"create":{"_index":"user","_id":2005}}
    {"name":"王五","address":"广东省广州市花都区","remark":"公司底层码农员工","age":31,"salary":4800,"birthDate":"1988-07-20"}
    

    如果必须指定不好去掉配置就好了。


    [5.4]、批量删除:

    POST _bulk
    {"delete":{"_index":"user","_id":2001}}
    {"delete":{"_index":"user","_id":2002}}
    {"delete":{"_index":"user","_id":2003}}
    

    6、简单的查询数据

    查询所有文档信息

    GET /user/_search
    

    根据关键字查询文档信息,注意:text类型可以根据字段分词搜索,keyword关键词不会处理分词器

    GET /user/_search?q=name:张三
    
  • 相关阅读:
    JAVA面试问题与解答(1-15)
    17个经典的Spring面试问答
    Linux下载——下载文件的命令
    MySQL入门——在Linux下安装和卸载MySQL
    MySQL入门——在Linux下安装和卸载MariaDB
    MySQL入门——MySQL数据库和SQL语言
    Linux性能分析——分析系统性能相关的命令
    Linux网络——查看网络连接情况的命令
    Linux网络——配置网络之iproute家族命令
    Linux网络——配置网络之ifconfig家族命令
  • 原文地址:https://www.cnblogs.com/tanghaorong/p/16295478.html
Copyright © 2020-2023  润新知