• elasticsearch索引的数据类型以及别名的使用


    在上篇文章写了关于elasticsearch索引的数据类型,这里就详细说下索引的增删改查以及其他的一些操作吧。

    1、索引的增、删、改、查

    先新建一个索引结构,代码如下

    PUT test-3-2-1
    {
      "mappings": {
        "properties": {
          "id": {
            "type": "integer"
          },
          "sex": {
            "type": "boolean"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "born": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
          },
          "location": {
            "type": "geo_point"
          }
        }
      }
    }
    
    • 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

    1.1向索引添加一条数据。

    POST test-3-2-1/_doc/1
    {
      "id": "1",
      "sex": true,
      "name": "张三",
      "born": "2020-09-18 00:02:20",
      "location": {
        "lat": 41.12,
        "lon": -71.34
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意:test-3-2-1/_doc/1,在增加的请求中,_doc表示索引的type,1表示_id,代表主键的意思,如果存在就会被覆盖。

    1.2 获取索引内容

    GET test-3-2-1/_doc/1
    
    • 1

    1.3 修改索引数据

    POST test-3-2-1/_update/1
    {
      "doc": {
        "sex": false,
        "born": "2020-02-24 00:02:20"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.4 删除索引

    DELETE test-3-2-1/_doc/1
    
    • 1

    1.5 索引数据的批量写入

    POST test-3-2-1/_bulk
    {"index":{"_id":"3"}}
    {"id":"3","name":"王五","sex":true,"born":"2020-09-14 00:02:20","location":{"lat":11.12,"lon":-71.34}}
    {"index":{"_id":"4"}}
    {"id":"4","name":"李四","sex":false,"born":"2020-10-14 00:02:20", "location":{"lat":11.12,"lon":-71.34}}
    {"index":{"_id":"5"}}
    {"id":"5","name":"黄六","sex":false,"born":"2020-11-14 00:02:20", "location":{"lat":11.12,"lon":-71.34}}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这样可以批量写入,通过index值,如果已经存在,会覆盖。

    2、索引的重建和使用乐观锁进行并发控制

    索引的重建,先创建一个索引以及分片规则,然后就可以进行移动了

    PUT newindex-3-1-3
    {
      "settings": {
        "number_of_shards": "5",
        "number_of_replicas": "1"
      }
    }
    POST _reindex
    {
      "source": {
        "index": "test-3-2-1"
      },
      "dest": {
        "index": "newindex-3-1-3"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.1 使用乐观锁进行并发控制

    低版本的Elasticsearch使用了_version字段来实现乐观锁,在Elasticsearch 7.9.1中使用_version进行并发控制会报错。它提供了两个新的字段_seq_no和_primary_term一起来实现乐观锁。假如你查出主键为1的文档的当前_seq_no为26、_primary_term为3,他是内置的,而且要两个参数一起判断才可以。

    PUT test-3-2-1/_doc/1?if_seq_no=26&if_primary_term=3
    {
      "id": "1",
      "sex": false,
      "name": "张三",
      "born": "2020-09-11 00:02:20",
      "location": {
        "lat": 41.12,
        "lon": -71.34
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3、索引的别名

    想象这样一种场景,假如有一个索引只有一个主分片,但是时间久了以后数据量越来越大,你决定为索引扩容,可是又不愿意重建索引。一个解决问题的办法就是,你可以创建一个新的索引保存新的数据,然后取一个别名同时指向这两个索引,这样在检索时使用别名就可以同时检索到两个索引的数据。

    3.1 别名的创建和删除

    先来新建两个索引logs-1和logs-2并添加数据。

    POST logs-1/_doc/10001
    {
      "visittime": "10:00:00",
      "keywords": "[世界杯]",
      "rank": 18,
      "clicknum": 13,
      "id": 10001,
      "userid": "2982199073774412",
      "key": "10001"
    }
    POST logs-2/_doc/10002
    {
      "visittime": "11:00:00",
      "keywords": "[奥运会]",
      "rank": 11,
      "clicknum": 2,
      "id": 10002,
      "userid": "2982199023774412",
      "key": "10002"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    添加一个索引别名logs指向这两个索引。

    POST /_aliases
    {
      "actions": [
        {
          "add": {
            "index": "logs-1",
            "alias": "logs"
          }
        },
        {
          "add": {
            "index": "logs-2",
            "alias": "logs"
          }
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    查看刚才创建的别名logs包含哪些索引,可以用下面的代码

    GET _alias/logs
    
    • 1

    如果要删除索引logs-1的别名,可以使用以下代码。

    POST /_aliases
    {
      "actions" : [
        { "remove": { "index" : "logs-1", "alias" : "logs" } }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用正则添加别名,以logs开头的索引都为别名

    POST /_aliases
    {
      "actions" : [
        { "add" : { "index" : "logs*", "alias" : "logs" } }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    配合使用别名和数据过滤可以达到类似于数据库视图的效果,可以把查询条件放入别名,这样在搜索别名时会自动带有查询条件,能起到数据自动过滤的作用。例如:

    POST /_aliases
    {
      "actions": [
        {
          "add": {
            "index": "logs*",
            "alias": "logs",
            "filter": {
              "range": {
                "clicknum": {
                  "gte": 10
                }
              }
            }
          }
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.2 滚动索引

    滚动索引当有一个索引数据量太大时,如果继续写入数据可能会导致分片容量过大,查询时会因内存不足引起集群崩溃。为了避免所有的数据都写入同一个索引,可以考虑使用滚动索引。滚动索引需要配合索引别名一起使用,可实现把原先写入一个索引的数据自动分发到多个索引中。

    先创建一个索引log1,它有一个别名logs-all。

    PUT /log1
    {
      "aliases": {
        "logs-all": {}
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后使用别名往log1中写入数据。

    PUT logs-all/_doc/1?refresh
    {
      "visittime": "10:00:00",
      "keywords": "[世界杯]",
      "rank": 18,
      "clicknum": 13,
      "id": 10001,
      "userid": "2982199073774412",
      "key": "10001"
    }
    PUT logs-all/_doc/2?refresh
    {
      "visittime": "11:00:00",
      "keywords": "[杯]",
      "rank": 20,
      "clicknum": 12,
      "id": 1121,
      "userid": "298219d9073774412",
      "key": "2"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    现在来为别名logs-all指定一个滚动索引,如果条件成立,就把新数据写入log2。

    POST /logs-all/_rollover/log2
    {
      "conditions": {
        "max_age":   "7d",
        "max_docs":  1,
        "max_size":  "5gb"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上面的滚动索引配置的条件是,如果往别名logs-all中写入的索引数据量大于等于1,或者主分片总大小超过5GB,或者创建索引的时间长度超过7天,就把新的数据写入新索引log2。该请求会返回滚动索引的执行结果,结果如下。

    我们也可以自动向下滚动

    PUT /log-000001
    {
      "aliases": {
        "logseries": {}
      }
    }
    POST /logseries/_rollover
    {
      "conditions": {
        "max_age":   "7d",
        "max_docs":  1,
        "max_size":  "5gb"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    API接口测试-postman自动生成测试报告
    力扣每日一题 ---- 2918. 数组的最小相等和
    Redis 命令工具
    5.SpringMVC的视图
    java惠购网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    CEC2023:基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2023(提供MATLAB代码及参考文献)
    kalman滤波与目标跟踪1: kalman滤波理论详解
    字节码文件(.class文件)
    保姆级Ubuntu从下载到正常使用,遇到各种问题解决方案。
    04、※NIO的理解、NIO的概念、缓冲区的读取数据、mark标志位置、reset回设的操作和通道文本数据获取与文本写出
  • 原文地址:https://blog.csdn.net/weixin_43360488/article/details/133718116