• ElasticSearch index、mapping、document


     

    ES中的几个概念

    • 索引 index

    相当于关系数据库中的数据库

    • 类型 type

    相当于关系数据库中的表
    ES 5.x中⼀个index可以新建多个type
    ES 6.x中⼀个index中只能新建⼀个type
    ES 7.x中只能使用内置的_doc,不能自己新建type

      

    • 映射 mapping

    定义每个字段的类型等信息,相当于关系数据库中的表结构

    • 字段 field

    相当于关系数据库表的字段

    • ⽂档 document

    相当于关系数据库中的⼀条记录

    • 分⽚ shard

    集群之后,每个节点存储index的一部分,这一部分叫做一个分片。
    分片有主副之分,副本分⽚(replica Shard)是主分⽚(primary Shard)的备份,当主分片故障之后,可以使用福分片代替。

    ES中常用的请求方式

    ES使用的的是RESTful风格的api。

     POST主要用于新建,更新、删除也可以;

    PUT主要用于更新,新建也可以。

    ES常用的调试方式

    • Postman  十分好用,推荐
    • curl命令   这个命令在Linux、Windows命令行都可以使用
    #查询集群状态,如果要查询index、document,后面加/接着写就行了
    #DELETE的用法类似
    curl -X GET http://192.168.1.9:9200
    
    
    #带数据,-H是设置header,-d是设置data
    #PUT用法类似
    curl -X POST http://192.168.1.9:9200/xxx/xxx/xxx" -H 'Content-Type:
    application/json' -d'
    {
     "xxx" : "xxx",
     "xxx" : "xxx"
    }

    -X可以省略,http://也可以省略。

    索引操作

    #新建一个index
    PUT 192.168.1.9:9200/mall
    
    #同时操作多个index,逗号隔开
    PUT 192.168.1.9:9200/mall,student
    
    #同时操作所有index
    PUT 192.168.1.9:9200/_all
    
    #把PUT换为GET就是查询,换为DELETE就是删除
    
    
    #以上返回的均是json,查看所有index的信息也可以这样
    #indices是index的复数,?v会显示项的名称
    GET 192.168.1.9:9200/_cat/indices?v
    
    
    #查看指定的index是否存在
    #如果返回的状态码是200 OK,表示该index存在;404 Not Found表示该index不存在
    #虽说GET也可以根据返回的内容来判断,但GET要获取index的具体信息,速度慢一些
    HEAD 192.168.1.9:9200/mall
    
    
    #关闭索引
    #如果不使用某个index,又不想删除它,可以关闭它
    #返回的该index信息中只有一个字段“closed”:true
    POST 192.168.1.9:9200/mall/_close
    
    #打开索引。关闭之后需要打开,才能继续使用此index
    #closed字段没了
    POST 192.168.1.9:9200/mall/_open
    
    #关闭和打开都是更新操作,所以用的是POST

    映射操作

    #新建mapping,这种带_的都是ES中预定义的。PUT也可换为POST,很多时候PUT、POST可以混用
    PUT 192.168.1.9:9200/mall/_mapping
    #在Body->raw->JSON中添加参数,keyword是关键字字段,text是普通文本字段
    {
     "properties": {
        "goods_name": {
            "type": "keyword"
        },
        "goods_price": {
            "type": "float"
        },
        "goods_description": {
            "type": "text"
        }
     }
    }
    


    #也可以在创建index时就指定mapping
    PUT 192.168.1.9:9200/mall

     {
      "mappings": {
        "properties": {
          "goods_name": {
            "type": "text"
          },
          "goods_price": {
            "type": "float"
          },
          "goods_description": {
            "type": "text"
          }
        }
      }
     }



    #查询mapping GET
    192.168.1.9:9200/mall/_mapping #同时查询多个index的mapping,逗号分隔index GET 192.168.1.9:9200/mall,student/_mapping #增加字段。新增是在原有的mapping上修改,使用POST POST 192.168.1.9:9200/mall/_mapping #在body中添加要增加的字段 { "properties": { "category":{ "type":"keyword" }, "stock":{ "type":"keyword" } } } #mapping中只能增加字段,不能修改已存在的字段

    文档操作


    #####增#######

    #添加一个document,需要用一个唯一的id来标识此document #6.x还可以自己新建一个type,7.x只能使用内置的_doc,不能自己新建type PUT 192.168.1.9:9200/mall/_doc/1 { "goods_name":"苹果", "goods_price":10.00, "goods_description":"新鲜苹果,10元一斤" }
    #不用传递所有的字段
    #如果没有设置mapping就直接添加document,添加第一个document时会自动根据body中的字段值来创建mapping,自动创建的mapping可能不符合我们的需求,尽量手动创建mapping


    #添加一个document可以不指定id,不指定id时ES会自动生成一个唯一的id #这时不是新增文档,而是修改内置的_doc,所以要用POST POST
    192.168.1.9:9200/mall/_doc { "goods_name":"芒果", "goods_price":6.00, "goods_description":"香甜芒果,6元一斤" }



    #如果返回的数据中没有"action.auto_create_index":"false",说明这个字段是true,自动创建索引是开启的
    GET 192.168.1.9:9200/_cluster/settings
    #如果自动创建索引是开启的,创建文档时,如果索引不存在,会先自动创建索引
    PUT 192.168.1.9:9200/mall/_doc/1



    #新建文档时,如果文档已存在会覆盖原来的文档,可以加参数?op_type=create,仅创建,如果文档已存在则不作任何操作
    PUT localhost:9200/nba/_doc/1?op_type=create
    {
    "goods_name":"芒果",
    "goods_price":6.00,
    "goods_description":"香甜芒果,6元一斤"
    }



    ####查#### #查询一个document GET 192.168.1.9:9200/mall/_doc/1


    #同时查询多个文档。因为要在body中传递数据,用POST
    POST localhost:9200/_mget
    #对象数组,这些文档可以是不同的index中的

     {
      "docs" : [
        {
        "_index" : "mall",
        "_type" : "_doc",
        "_id" : "1"
        },
        {
        "_index" : "mall",
        "_type" : "_doc",
        "_id" : "2"
        }
      ]
     }

     #如果指定了index,那就只能是这个index中的文档,body中不用指定index

     #POST 192.168.1.9:9200/mall/_mget

    {
      "docs" : [
        {
        "_type" : "_doc",
        "_id" : "1"
        },
        {
        "_type" : "_doc",
        "_id" : "2"
        }
      ]
    }



     #如果指定了index、type,那就只能是这个index、type中的文档,body中不用指定index、type

     #POST 192.168.1.9:9200/mall/_doc/_mget

    {
      "docs" : [
        {
        "_id" : "1"
        },
        {
        "_id" : "2"
        }
      ]
    }

    #body也可以这样写
    {
      "ids" : ["1", "2"]
    }




    ####改####

    #修改整个文档
    POST 192.168.1.9:9200/mall/_doc/1

      {
      "goods_name": "苹果",
      "goods_price": 16.0,
      "goods_decription":""
      }

    #此种方式是先删除原文档,再写入,就算只修改文档某个字段的值,都需要传入所有的字段,很麻烦
    #如果要用这种方式,不要一个字段一个字段地敲,先GET查询此文档,把_source里的字段复制粘贴到body中去改




    #修改|添加文档的多个字段
    POST 192.168.1.9:9200/mall/_update/1
    #上面查询多个文档,用的复数docs,这里修改单个文档,用单数doc

     {
      "doc": {
      "goods_price": 16.0,
      "goods_description":"..."
       }
      }

     #这种方式只修改指定的字段,如果之前该字段不存在,会自动添加该字段




    #修改|添加文档的单个字段
    POST 192.168.1.9:9200/mall/_update/1

     {
      "script": "ctx._source.goods_price = 18"
     }

      #ctx是context 上下文。上面的值18是数值型,如果是字符串要加单引,或者"转义

     #如果该字段不存在,会自动添加

      #移除文档的某个字段。将上面的body改一下即可

     {
       "script": "ctx._source.remove('goods_description')"
      }



      #可以使用参数

     POST 192.168.1.9:9200/mall/_update/1

     {
      "script": {
        "source": "ctx._source.goods_price = params.increment",
        "params":{
          "price":15.0
        }
      }
     }

     #可以进行数学运算,比如  ctx._source.goods_price += params.increment

     #更新文档时如果文档不存在,不报错,可以加一个upsert字段,如果指定的文档不存在,会先自动创建该文档

     POST 192.168.1.9:9200/mall/_update/3

     {

      "script": {
        "source": "ctx._source.goods_price = params.increment",
        "params":{
          "increment":15.0
        }
      },
      "upsert":{

      }
    }

    #upsert,即update的前部+insert的后部,insert有2层含义:1、更新文档时如果文档不存在,会自动往索引中插入该文档;2、在upsert中可以插入一些字段,创建该文档后初始化字段

      "upsert":{
        "goods_price":0.0,

        "goods_description":""
      }

    #比如说操作是goods_price+=increment,创建文档后需要给它初始化,才+得上去,不然默认值是null,将null和一个值相加会报错。

    #如果只是=赋值操作,倒不用初始化

     ####删####

     #删除一个文档

     DELETE 192.168.1.9:9200/mall/_doc/1

  • 相关阅读:
    java多线程(同步与死锁问题,生产者与消费者问题)
    剑指OFFER之跳台阶(九度OJ1388)
    剑指OFFER之二维数组中的查找(九度OJ1384)
    剑指OFFER之旋转数组的最小数字(九度OJ1386)
    我所思考的生活,致半年后的自己
    剑指OFFER之用两个栈实现队列(九度OJ1512)
    剑指OFFER之二维数组中的查找(九度OJ1384)
    剑指OFFER之重建二叉树(九度OJ1385)
    简单的客户机服务器投射模拟
    网络复习之TCP
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12710574.html
Copyright © 2020-2023  润新知