• Elasticsearch通过Http请求实现索引操作以及文档操作


      😊 @ 作者: 一恍过去
      🎊 @ 社区: Java技术栈交流
      🎉 @ 主题: Elasticsearch通过Http请求实现索引操作以及文档操作
      ⏱️ @ 创作时间: 2022年08月08日

      1.索引操作

      1.1.基本概念

      Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与SQL类似的。

      对比关系:

      索引(indices)-------------------------------- 数据库
      映射(mapping) ---------------- 表结构
      ​文档(Document)---------------- Row 行
      字段(Field)------------------- Columns 列

      对于7.x版本来说,没有type的概念,所以一个索引就是一类数据(相当于数据库),也不存在一个索引下多个文档。
      即一个索引(库)一个映射(表)

      详细说明:

      概念说明
      索引库(indices)
      文档(document)存入索引库原始的数据。比如每一条商品信息,就是一个文档(一行记录)
      字段(field)文档中的属性
      映射配置(mappings)字段的数据类型、属性、是否索引、是否存储等特性
      • 集群(cluster)

        • 集群由一个或多个节点组成,一个集群有⼀一个默认名称"elasticsearch"。
      • 节点(node)

        • 集群的节点,一台机器或者一个进程
      • 分片(shard)和副本(replica)

        • 副本是分片的副本。分⽚有主分片(primary Shard)和副本分片(replica Shard)之分。
        • 一个Index数据在物理理上被分布在多个主分片中,每个主分片只存放部分数据。
        • 每个主分片可以有多个副本,叫副本分片,是主分片的复制。
        • 如果副本数为1,则表示副分片的数量为主分片数量的一倍,并且分布到集群节点上
        • 默认情况下为1个分片,1个副本

      要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡。

      1.2.创建索引

      • 请求方式:PUT

      • 请求路径:ip+port/索引库名

      • 请求参数:json格式:

        #http请求 PUT /索引名称
        PUT http://192.168.80.121:9200/test
        #自定义参数(可省略),创建索引时需要创建分片,并且后续不能修改,只能重建索引
        {
            "settings": {
                "number_of_shards": 3,
                "number_of_replicas": 2
              }
        }
        
        #响应
        {
            "acknowledged": true,
            "shards_acknowledged": true,
            "index": "test_1"
        }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • settings:索引库的设置
        • number_of_shards:分片数量
        • number_of_replicas:副本数量

      1.3.索引别名

      • 请求方式:POST
      • 请求路径:ip+port/_aliases
      • 请求参数:json格式:
      # http请求 POST
      POST http://192.168.80.121:9200/_aliases
      {
        "actions": [
          {
            //添加别名可以多个索引指向一个别名
            "add": {
              "index": "test",
              "alias": "test_aliases"
            }
          }
        ]
      }
      
      # http请求 POST
      POST http://192.168.80.121:9200/_aliases
      {
        "actions": [
          //删除别名
          {
      		"remove": {
      			"index": "test",
      			"alias": "test_aliases"
      		}
      	}
        ]
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27

      1.4.查看索引

      1.4.1 查询所有索引

      • 请求方式:GET

      • 请求路径:ip+port/_cat/indices?v

      • 请求参数:无

      #查询所有所有索引
      http://192.168.80.121:9200/_cat/indices?v
      
      # 响应
      health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
      green  open   test  nwNbC8-iQru1QdBZQdxWgQ   3   2          0            0      1.8kb           624b
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • health :当前服务器健康状态: green(集群完整) 、yellow(单点正常|集群不完整)、 red(单点不正常)
      • status: 索引打开、关闭状态
      • index: 索引名
      • uuid: 索引统一编号
      • pri: 主分片数量
      • rep: 副本数量
      • docs.count: 可用文档数量
      • docs.deleted: 文档删除状态(逻辑删除)
      • store.size: 主分片和副分片整体占空间大小
      • pri.store.size: 主分片占空间大小

      1.4.2 查询单个索引

      • 请求方式:GET

      • 请求路径:ip+port/索引名称

      • 请求参数:无

      # 查询单个索引http  
      GET http://192.168.80.121:9200/test
      
      # 批量查询多个索引
      http://192.168.80.121:9200/test,test_3
      
      #响应
      {
      	# 索引名称
          "test": {
          	# 别名
              "aliases": {},
              # 映射
              "mappings": {},
              # 设置
              "settings": {
                  # 索引信息
                  "index": {
                  	# 索引创建时间
                      "creation_date": "1576763960125",
                      # 索引主分片数量
                      "number_of_shards": "3",
                      # 索引副分片数量
                      "number_of_replicas": "2",
                      # 索引唯一标识
                      "uuid": "K2hPH2qXSHyz52w6ndjLBA",
                      # 索引版本
                      "version": {
                          "created": "7020099"
                      },
                      # 索引名称
                      "provided_name": "test"
                  }
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36

      1.5.删除索引

      • 请求方式:DELETE
      • 请求路径:ip+port/索引名称
      • 请求参数:无
      # 删除索引
      DELETE http://192.168.80.121:9200/test
      
      #响应
      {
          "acknowledged": true
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      1.6.关闭/打开索引

      • 请求方式:POST
      • 请求路径:ip+port/_close或者_open
      • 请求参数:无
      # 关闭索引
      http://192.168.80.121:9200/test/_close
      
      # 打开索引
      http://192.168.80.121:9200/test/_open
      
      • 1
      • 2
      • 3
      • 4
      • 5

      1.7.映射配置

      索引有了,接下来肯定是添加数据。但是,在添加数据之前最好定义映射。

      映射:类似于设置数据库的表结构,是设置字段类型、是否分词、是否索引、是否储存这些属性的一个过程

      1.7.1.创建映射字段

      注意:

      可以为一个索引多次执行映射字段请求,并且如果字段不存在在,会新加到映射中,但是不能删除映射。

      创建映射后,在创建文档时,如果文字的字段不存在于当前索引映射中,es会字段为新增的字段自动创建一个映射。

      • 请求方式:PUT
      • 请求路径:ip+port/索引名称/_mapping
      • 请求参数:josn
      # PUT /索引库名/_mapping
      
      # 参数说明
      {
        "properties": {
          "属性名(类型)": {
            "type": "类型",
            "analyzer": "分词器",
            "index":"是否索引",
            "store":"是否储存"
          }
       }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      示例

      #http请求 PUT
      http://192.168.80.121:9200/test/_mapping
      #请求参数
      {
        "properties": {
          "name": {
            "type": "text",
            "analyzer": "ik_max_word"
          },
          "address": {
            "type": "keyword",
            "index": "false"
          },
          "age": {
            "type": "integer",
             "index": "false"
          }
        }
      }
      
      #响应
      {
        "acknowledged": true
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 类型名称:类似于数据库中的不同表,名称任意
      • type:类型,可以是text、keyword、long、short、float、double、date、integer、object等
      • index:是否索引(是否用于检索),默认为true;如果为Date类型,默认不创建索引
      • store:是否存储,默认为false
      • analyzer:分词器,这里的ik_max_word即使用ik分词器,必须事先安装ik分词器插件

      1.7.2.查看映射关系

      • 请求方式:GET

      • 请求路径:ip+port/索引名称/_mapping

      • 请求参数:无

      #http请求 GET
      http://192.168.80.121:9200/test/_mapping
      
      #响应
      {
          "test": {
              "mappings": {
                  "properties": {
                      "address": {
                          "type": "keyword",
                          "index": false
                      },
                      "age": {
                          "type": "integer",
                          "index": false
                      },
                      "name": {
                          "type": "text",
                          "analyzer": "ik_max_word"
                      }
                  }
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24

      1.7.3.字段属性详解

      1.7.3.1.type

      Elasticsearch中支持的数据类型非常丰富:
      在这里插入图片描述

      几个关键的:

      • String类型,分为两种:

        • text:可分词,不可参与聚合。
        • keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合。
          进行聚合、排序、过滤的字段,不能被分词
      • Numerical:数值类型,分两类

        • 基本数据类型:long、interger、short、byte、double、float、half_float
        • 浮点数的高精度类型:scaled_float
          • 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
      • Date:日期类型
        elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

      1.7.3.2.index

      index影响字段的索引情况。

      • true:字段会被索引,则可以用来进行查询。默认值就是true
      • false:字段不会被索引,不能用来搜索

      index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。

      但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。

      1.7.3.3.store

      是否将数据进行额外存储,通常取默认false

      Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source的属性中。而且我们可以通过过滤_source来选择哪些要显示,哪些不显示。

      而如果设置store为true,就会在_source以外额外存储一份数据。

      1.7.4. 重建索引(映射)

      # 0、查看旧索引
      GET 索引库名
      GET http://192.168.80.121:9200/索引名称
      
      #1、新建一个索引(新建映射)
      	#新建的索引在原来索引基础上修改要更新的地方即可(比如修改字段名称、字段类型等)
      	#首先新建索引
      	PUT http://192.168.80.121:9200/test
      	#设置映射
      	PUT /索引库名/_mapping
      	
      #2、将旧索引拷贝至新索引,旧索引会自动复制新索引没有属性
      	#异步参数:wait_for_completion
      	POST  http://192.168.80.121:9200/_reindex [?wait_for_completion=false]
          {
              "source": {
                  "index": "旧索引名称"
              },
              "dest": {
                  "index": "新索引名称"
              }
          }
      
       #3、如果使用了别名,进行别名重构
       POST _aliases
      {
        "actions": [
          {
            //添加别名可以多个索引指向一个别名
            "add": {
              "index": "nba3",
              "alias": "nba_latest"
            }
          },
          //删除别名
          {
      		"remove": {
      			"index": "nba",
      			"alias": "nba_latest"
      		}
      	}
        ]
      }
      #4、替换别名后 删除旧索引
      DELETE http://111.229.160.175:9200/索引名称
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45

      1.8 创建索引时建立映射

      • 请求方式:PUT
      • 请求路径:ip+port/索引名称
      • 请求参数:josn
      PUT http://111.229.160.175:9200/test
      {
      	# 索引分片设置
          "settings": {
              "number_of_shards": 3,
              "number_of_replicas": 2
            },
          # 索引映射关系
          "mappings": {
              "properties": {
                  "name": {
                    "type": "text"
                  }
              }
          }
       }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16

      2.文档操作

      2.1.新增

      通过POST请求,可以向一个已经存在的索引库中添加数据。

      • 请求方式:POST
      • 请求路径:ip+port/索引名称/_doc/id(id可以忽略),id不指定时会随机生成
      • 请求参数:无
      POST /索引库名/ _doc/id(主键,可以忽略)
      {
          "key":"value"
      }
      
      • 1
      • 2
      • 3
      • 4

      示例:

      # http请求 POST ,id存在则修改,不存在则新增
      http://192.168.80.121:9200/test/_doc/(id)
      
      #参数
      {
          "name":"李四",
          "address":"大学城一号",
          "age":20
      }
      
      #响应
      {
          "_index": "test",
          "_type": "_doc",
          "_id": "1",
          "_version": 4, #被修改次数
          "result": "updated", #操作类型 updated/create,id存在则会是修改类型
          "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
          },
          "_seq_no": 4,  #该映射操作次数
          "_primary_term": 1	
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25

      2.2.查看

      1、根据ID查询单个文档

      语法

      • 请求方式:GET
      • 请求路径:ip+port/索引名称/_doc/id
      • 请求参数:无

      示例

      #http请求 GET
      http://192.168.80.121:9200/test/_doc/1
      
      #响应
      {
          "_index": "test",
          "_type": "_doc",
          "_id": "1",
          "_version": 7,
          "_seq_no": 14,
          "_primary_term": 1,
          "found": true,
          "_source": {
              "title": "小米手机",
              "images": "http://image.leyou.com/12479122.jpg",
              "price": 2699.00
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

      2、批量查询文档

      • 请求方式:POST
      • 请求路径:ip+port/_mgetip+port/索引名/_mgetip+port/索引名/_doc/_mget
      • 请求参数:json
      1、POST /_mget
      #请求参数
      {
          "docs":[
              {
                  "_index":"索引名称",
                  "_type":"_doc",
                  "_id":"id"
              }
          ]
      }
      
      2、POST 索引名/_mget
      #请求参数
      {
          "docs":[
              {
                  "_type":"_doc",
                  "_id":"id"
              }
          ]
      }
      
      3、POST 索引名/_doc/_mget
      #请求参数
      {
          "ids":[1,2]
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28

      示例

      #http请求 POST
      http://192.168.80.121:9200/_mget
      #参数
      {
          "docs":[
              {
                  "_index":"test",
                  "_type":"_doc",
                  "_id":"1"
              },
              {
                  "_index":"test",
                  "_type":"_doc",
                  "_id":"2"
              }
          ]
      }
      
      #响应
      {
          "docs": [
              {
                  "_index": "test",
                  "_type": "_doc",
                  "_id": "1",
                  "_version": 8,
                  "_seq_no": 15,
                  "_primary_term": 1,
                  "found": true,
                  "_source": {
                      "name":"李四",
                      "address":"大学城一号",
                      "age":20
                  }
              },
              {
                  "_index": "test",
                  "_type": "_doc",
                  "_id": "2",
                  "_version": 8,
                  "_seq_no": 11,
                  "_primary_term": 1,
                  "found": true,
                  "_source": {
                      "name":"张三",
                      "address":"大学城一号",
                      "age":22
                  }
              }
          ]
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51

      2.3.智能判断

      Elasticsearch非常智能,你不需要给索引库设置任何mapping映射,它也可以根据你输入的数据来判断类型,动态添加数据映射。

      实际中 应该先添加或者修改好映射,再添加数据,这样做可以选择哪些进行分词,哪些不分词

      添加数据:

      # 新增文档时,额外添加 gender、height 两个字段。
      POST /test/_doc/3
      
      {
        "name":"张三",
        "address":"大学城一号",
        "age":22,
        "gender":1,
        "height":180
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      查询结果

      GET  /test/_doc/3
      # 查看时可以看到文档增加了gender、height两个字段。
      
      {
          "_index": "test",
          "_type": "_doc",
          "_id": "3",
          "_version": 1,
          "_seq_no": 16,
          "_primary_term": 1,
          "found": true,
          "_source": {
            "name":"张三",
            "address":"大学城一号",
            "age":22,
            "gender":1,
            "height":180
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

      索引库的映射关系

      GET /test/_mapping
      # 映射中增加了增加了gender、height两个字段。
      {
          "test": {
              "mappings": {
                  "properties": {
                      "address": {
                          "type": "keyword",
                          "index": false
                      },
                      "age": {
                          "type": "integer",
                          "index": false
                      },
                      "gender": {
                          "type": "long"
                      },
                      "height": {
                          "type": "long"
                      },
                      "name": {
                          "type": "text",
                          "analyzer": "ik_max_word"
                      }
                  }
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28

      2.4.修改数据(文档)

      id对应文档不存在时无法进行修改,修改文档只能修改id已经存在的文档内容;
      修改文档时,传入了文档中不存在的字段时,字段会自动创建,并且自动生成映射关系;

      • 请求方式:POST
      • 请求路径:ip+port/索引名称/_update/id值
      • 请求参数:josn
      1、文档全局修改
      #http请求 POST
      POST http://192.168.80.121:9200/test/_update/1
      
      #参数,[6.x不要doc属性]
      {
      	"doc": {
            "name":"张三",
            "address":"大学城一号",
            "age":22,
            "class":"一班"
      	}
      }
      # class字段不存在,会被创建,并且生成映射
      
      2、根据id增加指定字段并且赋值
      #http请求 
      POST http://192.168.80.121:9200/test/_update/1
      #参数,添加·`school`字段
      {
      	"script": "ctx._source.school = '北京大学'"
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      2.5.删除数据(文档)

      根据ID删除:

      • 请求方式:DELETE

      • 请求路径:ip+port/索引库名/_doc/id

      • 请求参数:无

      # DELETE /索引库名/_doc/id
      #http请求 DELETE
      DELETE http://192.168.80.121:9200/test/_update/1
      
      • 1
      • 2
      • 3

      按条件删除:

      • 请求方式:DELETE

      • 请求路径:ip+port/索引库名/_delete_by_query

      • 请求参数:json

      #http请求 DELETE
      DELETE http://192.168.80.121:9200/test/_delete_by_query
      
      # 请求参数
      {
       "query":{
         "match":{
           "name":"李四"
         }
       }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 相关阅读:
      MMDetection自定义双主干Transformer模型(一)
      django使用多个数据库实现
      SSM篇目录总结
      分析悬链线中心的横坐标位置
      学习并了解MQ消息队列
      请别再使用 parseInt() 了
      Redis数据库安装(Windows)
      视觉任务相关的问题汇总
      C#中的DateTime类
      嵌入式系统开发【深入浅出】 GPIO 类设备的驱动程序
    • 原文地址:https://blog.csdn.net/zhuocailing3390/article/details/126216967