elasticsearch 的基本操作多维度分享

news2024/11/17 13:30:47

目录

一、索引操作

二、映射操作

三、文档操作


elasticsearch 的基本操作多维度分享此篇正式分享,具体包括索引、映射、文档的相关处理,模拟生成环境,通过DSL语句和java的高级REST形式全方位展示给大家;

一、索引操作

1、创建索引:设置分片和副分片

PUT /nandao_scenic
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 2
  } ,
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      },
      "city":{
        "type": "keyword"
      },
      "price":{
        "type": "double"
      }
    }
  }
}

2、删除索引

DELETE /nandao_scenic

3、关闭索引

POST /nandao_scenic/_close

4、打开索引

POST /nandao_scenic/_open

还有很多类似的DSL语句,具体可以参考:

 5、索引别名:

每个月一个索引,我要查1、2月份的数据,只能建立别名索引,即通过一个索引去查数据

5.1、一月份的索引和数据

PUT /nandao_one_log
{
  "mappings": {
    "properties": {
      "scenic_id":{
        "type": "keyword"
      },
      "uid":{
        "type": "keyword"
      },
      "check_in_date":{
        "type": "keyword"
      }
    }
  }
}


POST /nandao_one_log/_doc/01
{
  "uid":"01",
   "scenic_id":"1212",
  "check_in_date":"2023-01-23"
}

5.2、二月份的索引和数据

PUT /nandao_two_log
{
  "mappings": {
    "properties": {
      "scenic_id":{
        "type": "keyword"
      },
      "uid":{
        "type": "keyword"
      },
      "check_in_date":{
        "type": "keyword"
      }
    }
  }
}

POST /nandao_two_log/_doc/01
{
  "uid":"01",
   "scenic_id":"1552",
  "check_in_date":"2023-02-23"
}

5.3、构建别名索引

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "nandao_one_log",
        "alias": "last_two_month"
      }
    },
    {
      "add": {
        "index": "nandao_two_log",
        "alias": "last_two_month"
      }
    }
  ]
}

5.4、通过别名索引查询数据

GET /last_two_month/_search
{
  "query": {
    "term": {
        "uid": "01"
    }
  }
}

#查询结果,1、2月份的数据
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.6931471,
    "hits" : [
      {
        "_index" : "nandao_one_log",
        "_type" : "_doc",
        "_id" : "01",
        "_score" : 0.6931471,
        "_source" : {
          "uid" : "01",
          "scenic_id" : "1212",
          "check_in_date" : "2023-01-23"
        }
      },
      {
        "_index" : "nandao_two_log",
        "_type" : "_doc",
        "_id" : "01",
        "_score" : 0.2876821,
        "_source" : {
          "uid" : "01",
          "scenic_id" : "1552",
          "check_in_date" : "2023-02-23"
        }
      }
    ]
  }
}

 6、向别名索引中写数据-错误示例

POST /last_two_month/_doc/02
{
  "uid":"02",
   "scenic_id":"12232",
  "check_in_date":"2023-02-23"
}

此时是报错的,不知道往哪个目标索引写数据,设置目标索引:

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "nandao_one_log",
        "alias": "last_two_month",
        "is_write_index":true
      }
    } 
  ]
}

 设置完成后再通过别名索引写数据就可以成功了!

7、间接添加数据分片

数据分片不能改变,但是随着业务数据的急剧增长,需要增加分片,这时候我们只能通过别名索引间接添加分片

7.1、最初的索引

PUT /nandao_scenic_1
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 2
  } ,
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      },
      "city":{
        "type": "keyword"
      },
      "price":{
        "type": "double"
      }
    }
  }
}

7.2、最初的别名索引

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "nandao_scenic_1",
        "alias": "nandao_scenic_a"
        
      }
    } 
  ]
}

 7.3、新建更多分片的索引:

PUT /nandao_scenic_2
{
  "settings": {
    "number_of_shards": 10,
    "number_of_replicas": 2
  } ,
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      },
      "city":{
        "type": "keyword"
      },
      "price":{
        "type": "double"
      }
    }
  }
}

当数据向nandao_scenic_2索引写完后,就可以正式切换索引了! 

7.4、最终的别名索引

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "nandao_scenic_1",
        "alias": "nandao_scenic_a"
        
      }
    } ,
    {
      "add": {
        "index": "nandao_scenic_2",
        "alias": "nandao_scenic_a"
        
      }
    } 
  ]
}

二、映射操作

1、查看索引映射

GET /nandao_scenic/_mapping

#结果
{
  "nandao_scenic" : {
    "mappings" : {
      "properties" : {
        "city" : {
          "type" : "keyword"
        },
        "price" : {
          "type" : "double"
        },
        "title" : {
          "type" : "text"
        }
      }
    }
  }
}

2、扩展映射:

POST /nandao_scenic/_mapping
{
  "properties":{
    "tag":{
      "type":"keyword"
    }
  }
}

3、基本数据类型

3.1、keyword 类型是不进行切分的字符串类型,一般用来描述姓名、类型、用户id、URL和状态码等

3.2、text 类型是可进行切分的字符串类型,一般用match匹配搜索,如果用term查询,会查不到数据的。

3.3、数值类型包括long、integer、short、byte、double、float等常用类型,一般用gte\lte等参数查询,即范围查询。

3.4、布尔类型,是或否的意思,比较容易理解。

3.5、日期类型,date,可以使用范围查询,20221212类型,尽量不要format类型,处理历史数据容易出错。

添加扩展映射:

#继续扩展映射
POST /nandao_scenic/_mapping
{
  "properties":{
    "full":{
      "type":"boolean"
    },
      "creata_time":{
        "type":"date"
      }
  }
}

查询看到所有常用的基本数据类型:

{
  "nandao_scenic" : {
    "mappings" : {
      "properties" : {
        "city" : {
          "type" : "keyword"
        },
        "creata_time" : {
          "type" : "date"
        },
        "full" : {
          "type" : "boolean"
        },
        "price" : {
          "type" : "double"
        },
        "tag" : {
          "type" : "keyword"
        },
        "title" : {
          "type" : "text"
        }
      }
    }
  }
}

 4、复杂的数据类型

4.1、数组类型

比如上面的tag字段时keyword类型,但是可以存数组,后期搜索时对应原来的term,精准完全匹配原则,也是用相应的数组数据去查询,如果需要的话:

POST /nandao_scenic/_doc/002
{
  "title":"五台山",
  "city":"山西",
  "price":"88.8",
  "tag":["有车位","人多"]
}

查询语句

GET /nandao_scenic/_search
{
  "query": {
    "term": {
      "tag": {
        "value": "人多"
      }
    }
  }
}

 4.2、对象类型

对象和数组一样不用事先定义,写入时自动转化成对象类型,同时对应的索引映射中也有相应的变化,比如:

POST /nandao_scenic/_doc/001
{
  "title":"五山",
  "city":"江西",
  "price":"88.8",
  "comment":{  //对象数据
    "properties":{
      "good":88,  //好评
      "bad":7    //差评
    }
  } 
}

查询方式:比如好评大于10的景区

GET /nandao_scenic/_search
{
  "query": {
    "range": {
      "comment.properties.good": {
        "gte": 10
      }
    }
  }
}

 4.3、地理类型

互联网时代位置定位越来越多,es顺势也支持地理类型,扩展相应索引

POST /nandao_scenic/_mapping
{
  "properties":{
    "location":{
      "type":"geo_point"
    }
  }
}

添加包含地理类型数据

POST /nandao_scenic/_doc/003
{
  "title":"雍和宫",
  "city":"北京",
  "price":"88.8",
  "location":{
      "lat":80.01234,
      "lon":118.98756
    }
}

 5、动态映射

5.1、多字段处理:

对于一个相同的字段有时需要不同的数据类型,即不同的业务选择不同的查询方式,比如在用户查询过程,既要根据用户查询,又要进行模糊查询或者姓氏查询,此时我们在mapping映射过程建立text和keyword两份索引,其中keyword作为子字段类型:

PUT /nandao_scenic_order
{
  "mappings": {
    "properties": {
      "order_id":{
        "type": "keyword"
      },
      "user_id":{
        "type": "keyword"
      },
        "user_name":{
        "type": "text",
        "fields": {
          "user_name_keyword":{
             "type": "keyword"
          }
        }
      },
      "scenic_id":{
        "type": "keyword"
      }
    }
  }
}

写入多字段数据

#写入多字段数据
POST /nandao_scenic_order/_doc/001
{
  "order_id":"009",
  "user_id":"u001",
  "user_name":"nandao",
    "scenic_id": "s001"
}

POST /nandao_scenic_order/_doc/002
{
  "order_id":"008",
  "user_id":"u002",
  "user_name":"lisi",
    "scenic_id": "s002"
}

POST /nandao_scenic_order/_doc/003
{
  "order_id":"0011",
  "user_id":"u003",
  "user_name":"wang wu",
    "scenic_id": "s003"
}

POST /nandao_scenic_order/_doc/004
{
  "order_id":"0010",
  "user_id":"u004",
  "user_name":"su wu",
    "scenic_id": "s004"
}

 查询并排序

GET /nandao_scenic_order/_search
{
  "query": {
    "match": {
      "user_name": "wu"
    }
  },
  "sort": 
    {
      "user_name.user_name_keyword": "desc"
    }
}

查询结果:

{
  "took" : 369,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "nandao_scenic_order",
        "_type" : "_doc",
        "_id" : "003",
        "_score" : null,
        "_source" : {
          "order_id" : "0011",
          "user_id" : "u003",
          "user_name" : "wang wu",
          "scenic_id" : "s003"
        },
        "sort" : [
          "wang wu"
        ]
      },
      {
        "_index" : "nandao_scenic_order",
        "_type" : "_doc",
        "_id" : "004",
        "_score" : null,
        "_source" : {
          "order_id" : "0010",
          "user_id" : "u004",
          "user_name" : "su wu",
          "scenic_id" : "s004"
        },
        "sort" : [
          "su wu"
        ]
      }
    ]
  }
}

倒序、正序均可以排列查询。

三、文档操作

1、单条文档写入:上面已经演示,此处演示不指定文档id,即_doc后面不加id即可


POST /nandao_scenic_order/_doc
{
  "order_id":"0010",
  "user_id":"u004",
  "user_name":"su wu",
    "scenic_id": "s004"
}

REST客户端java语言展示

 public void singleIndexDoc(Map<String, Object> dataMap, String indexName, String indexId) {
        IndexRequest indexRequest = new IndexRequest(indexName).id(indexId).source(dataMap);//构建IndexRequest对象并设置对应的索引和_id字段名称
        try {
            IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);//执行写入
            String index = indexResponse.getIndex();//通过IndexResponse获取索引名称
            String id = indexResponse.getId();//通过IndexResponse获取文档Id
            Long version = indexResponse.getVersion();//通过IndexResponse获取文档版本
            System.out.println("index=" + index + ",id=" + id + ",version=" + version );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 2、批量写入

DSL语言:

 POST /_bulk
{"index":{"_index":"nandao_scenic","_id":"7"}}
{"title":"少林寺","city":"河南","price":"88.8","tag":["有位","人少"]}
{"index":{ "_index":"nandao_scenic", "_id":"8"}}
 {"title":"动物园","city":"河南","price":"80.8","tag":["有位","人少"]}

注意:一行一行的写,不能结构化,否则报错。 

java语言:

    //批量写入索引
    public void bulkIndexDoc(String indexName, String docIdKey, List<Map<String, Object>> recordMapList) {
        BulkRequest bulkRequest = new BulkRequest(indexName);//构建批量操作BulkRequest对象
        for (Map<String, Object> dataMap : recordMapList) {//遍历数据
            String docId = dataMap.get(docIdKey).toString();//获取主键作为Elasticsearch索引的主键
            IndexRequest indexRequest = new IndexRequest().id(docId).source(dataMap);//构建IndexRequest对象
            bulkRequest.add(indexRequest);//添加IndexRequest
        }
        bulkRequest.timeout(TimeValue.timeValueSeconds(5));//设置超时时间
        try {
            BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);//执行批量写入
            if (bulkResponse.hasFailures()) {//判断执行状态
                System.out.println("bulk fail,message:" + bulkResponse.buildFailureMessage());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3、单条更新

DSL语句

  #更新单条数据
 POST /nandao_scenic/_update/001
 {
   "doc": {
     "title":"海洋馆",
    "city":"河南",
    "price":"100.8",
   "tag":["有车位","好玩"]
   }
 }

 #如果存在就更新,否则插入数据
  POST /nandao_scenic/_update/001
 {
   "doc": {
     "title":"海洋馆",
    "city":"河南",
    "price":"100.8",
   "tag":["有车位","好玩"]
   },
    "upsert": {
     "title":"海洋馆",
    "city":"河南",
    "price":"100.8",
   "tag":["有车位","好玩"]
   }
 }

java客户端语句

    //单条update
    public void singleUpdate(String indexName, String docIdKey, Map<String, Object> recordMap) {
        UpdateRequest updateRequest = new UpdateRequest(indexName, docIdKey);
        updateRequest.doc(recordMap);
        try {
            UpdateResponse updateResponse=client.update(updateRequest, RequestOptions.DEFAULT);
            String index = updateResponse.getIndex();//通过IndexResponse获取索引名称
            String id = updateResponse.getId();//通过IndexResponse获取文档Id
            Long version = updateResponse.getVersion();//通过IndexResponse获取文档版本
            System.out.println("index=" + index + ",id=" + id + ",version="+version);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //单条upsert文档
    public void singleUpsert(String index, String docIdKey, Map<String, Object> recordMap,Map<String, Object> upRecordMap) {
        UpdateRequest updateRequest = new UpdateRequest(index, docIdKey);//构建UpdateRequest
        updateRequest.doc(recordMap);//设置写更新辑
        updateRequest.upsert(upRecordMap);//设置插入逻辑
        try {
            client.update(updateRequest, RequestOptions.DEFAULT);//执行upsert
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4、批量更新文档

DSL语句

 POST /_bulk
{"update":{"_index":"nandao_scenic","_id":"7"}}
{"doc":{"title":"少林寺1","city":"河南","price":"88.8","tag":["有位","人少"]}}
{"update":{ "_index":"nandao_scenic", "_id":"8"}}
 {"doc":{"title":"动物园1","city":"河南","price":"80.8","tag":["有位","人少"]}}

java语句

public void bulkUpsert(String indexName, String docIdKey, List<Map<String, Object>> recordMapList) {
        BulkRequest bulkRequest = new BulkRequest();//新建请求
        //遍历所有的提示词和提示词对应的拼音形式数据
        for (Map<String, Object> dataMap : recordMapList) {
            String docId = dataMap.get(docIdKey).toString();//获取主键作为Elasticsearch索引的主键
            UpdateRequest updateRequest = new UpdateRequest(indexName, docId).doc(dataMap, XContentType.JSON).upsert(dataMap, XContentType.JSON);//构建写入请求
            bulkRequest.add(updateRequest);//批量加入写入请求
        }
        try {
            BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);//获取批量写入的返回结果
            if (bulkResponse.hasFailures()) {//判断是否写入失败
                System.out.println("bulk fail,message:" + bulkResponse.buildFailureMessage());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5、根据条件更新文档

DSL语句

 POST /nandao_scenic/_update_by_query
 {
   "query": {
     "term": {
       "city": {
         "value": "北京"
       }
     }
   },
   "script": {
     "source": "ctx._source['city']='北京市'",
     "lang": "painless"
   }
 }

java语句

  public void updateCityByQuery(String index,String oldCity,String newCity) {
        UpdateByQueryRequest updateByQueryRequest=new UpdateByQueryRequest(index);//构建UpdateByQueryRequest对象
        updateByQueryRequest.setQuery(new TermQueryBuilder("city",oldCity));//设置按照城市查找文档的query
        updateByQueryRequest.setScript(new Script("ctx._source['city']='"+newCity+"';"));//设置更新城市字段的脚本逻辑
        try {
            client.updateByQuery(updateByQueryRequest,RequestOptions.DEFAULT);//执行更新
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

6、删除单条

 DELETE /nandao_scenic/_doc/001

java语言

  public void singleDelete(String index, String docId) {
        DeleteRequest deleteRequest=new DeleteRequest(index,docId);//构建删除请求
        try {
            client.delete(deleteRequest, RequestOptions.DEFAULT);//执行删除
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

7、批量删除

  POST /_bulk
{"delete":{"_index":"nandao_scenic","_id":"7"}}
{"delete":{ "_index":"nandao_scenic", "_id":"8"}}

java客户端语言

public void bulkDelete(String index, String docIdKey, List<String> docIdList) {
        BulkRequest bulkRequest = new BulkRequest();//构建BulkRequest对象
        for (String docId : docIdList) {//遍历文档_d列表
            DeleteRequest deleteRequest=new DeleteRequest(index,docId);//构建删除请求
            bulkRequest.add(deleteRequest);//创建UpdateRequest对象
        }
        try {
            BulkResponse bulkResponse = client.bulk(bulkRequest,RequestOptions.DEFAULT);//执行批量删除
            if (bulkResponse.hasFailures()) {//判断状态
                System.out.println("bulk fail,message:" + bulkResponse.buildFailureMessage());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

8、根据条件删除

 POST /nandao_scenic/_delete_by_query
 {
   "query": {
     "term": {
       "city": {
         "value": "北京"
       }
     }
   }
 }

java语言客户端

public void deleteByQuery(String index,String city) {
        DeleteByQueryRequest deleteByQueryRequest=new DeleteByQueryRequest(index);//构建DeleteByQueryRequest对象
        deleteByQueryRequest.setQuery(new TermQueryBuilder("city",city));//设置按照城市查找文档的query
        try {
            client.deleteByQuery(deleteByQueryRequest,RequestOptions.DEFAULT);//执行删除
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 到此、es基本操作分享完毕,下篇我们分享es丰富的搜索功能,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023超好用的Mac清理优化工具CleanMyMacX

CleanMymac X Mac版本&#xff0c;以一种全面的方式扫描Mac系统以允许垃圾隐藏&#xff0c;您只需要轻松单击左鼠标按钮即可清洁数字G的垃圾&#xff0c;这是如此简单。立即提高您的MAC速度。为Apple System计算机建造可以帮助用户清理多种类型的垃圾和其他恶意束&#xff0c;提…

Sentinel 控制台安装与详解

Sentinel 控制台包含如下功能: 查看机器列表以及健康情况&#xff1a;收集 Sentinel 客户端发送的心跳包&#xff0c;用于判断机器是否在线。监控 (单机和集群聚合)&#xff1a;通过 Sentinel 客户端暴露的监控 API&#xff0c;定期拉取并且聚合应用监控信息&#xff0c;最终可…

AIGC + 任意应用情景组合,从技术层面给了大家体验不同领域的创作的机会

还在为学技术的时候面对一大堆教程苦恼&#xff1f;画画、剪辑、建模 ... 啥啥啥都想学 &#x1f92f;AIGC 来解决&#xff01;&#xff01;每个人都有机会当五分钟艺术家&#xff01;AIGC 究竟有多强大&#xff1f;简单用一个公式来概况 AIGC 的强大之处&#xff0c;就是 AIG…

Harbor 镜像仓库

目录 一、Harboar概述 1.1 什么是 Harbor 1.2 Harbor优势 1.3 Harbor构成 1.4 Harbor的误区 二、Harbor 安装&#xff08;http&#xff09; 2.1 两种方式 2.2 具体安装步骤 2.2.1 先安装Docker和Docker Compose 2.2.2 下载Harbor 2.2.3 harbor.yml 的hostname 2.2.…

梳理一下我在2022年读过的23本书

作者 | gongyouliu编辑 | gongyouliu2022年我一共看了23本书&#xff0c;比自己之前定的目标——每年看36本书——少了不少。今天特意花大半天时间写一篇文章来整理一下今年看的书&#xff0c;梳理一下自己的思路&#xff0c;也算是留下一份记录。这份书单也希望给大家作为参考…

从这两道题重新理解,JS的this、作用域、闭包、对象

日常开发中&#xff0c;我们经常用到this。例如用Jquery绑定事件时&#xff0c;this指向触发事件的DOM元素&#xff1b;编写Vue、React组件时&#xff0c;this指向组件本身。对于新手来说&#xff0c;常会用一种意会的感觉去判断this的指向。以至于当遇到复杂的函数调用时&…

spring、mybatis、spring-mybatis、springboot-mybatis的配置文件

第一个Spring程序 第一个Mybatis程序 第一个Spring-Mybatis程序 第一个SpringBoot-Mybatis程序 1. Spring程序配置文件 beans.xml&#xff1a;/resources <!--注册一个Bean--><bean id"hello" class"com.kuang.pojo.Hello"><property nam…

03 I2C

特点 两根线 SCL SDA同步、半双工带数据应答支持总线挂载多设备 一主多从 多主多从 两个功能&#xff1a; 读取外设模块指定位置的寄存器写外设模块指定位置的寄存器一个完整的通讯协议一定是在软件和硬件上同时定义的。 硬件 所有的I2C设备的时钟线与数据线都要连在一起设备…

普元技术专家2022历史文章合集

大家好&#xff0c;新年快乐。‍献上2022年历史文章合集&#xff0c;方便你翻阅过去一年里的精华文章。【第一辑】企业服务总线&#xff08;ESB&#xff09;基于ESB的企业服务集成平台建设之道企业服务总线建设之道的探索与研究零代码能力干掉80%开发工作&#xff1a;普元ESB 8…

论文综述——Event-Event Relation Extraction using Probabilistic Box Embedding

Event-Event Relation Extraction using Probabilistic Box Embedding1 任务介绍2 Box Embedding3 BERE模型4 实验5 总结1 任务介绍 事件关系抽取&#xff1a;文本中包含多个事件e1,e2,…,en&#xff0c;识别每个事件对(ei,ej)之间的关系r(ei,ej) 子事件(Subevent)关系抽取&a…

(一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>

一、工作环境及项目简介 立创EDA&#xff1a;硬件原理图及PCB绘制。 全志F1C200S&#xff1a;F1C100S内置32MB DDR1内存&#xff0c;F1C200S内置64MB DDR1内存。 原理图&#xff1a;参考开源项目&#xff0c;详见墨云&#xff0c; 详见peng-zhihui。 核心板&#xff1a;四层…

Java8 - Streams flatMap()

文章目录What is flatMap()?Why flat a Stream?DemoWhat is flatMap()? # Stream<String[]> # Stream<Stream<String>> # String[][][[1, 2],[3, 4],[5, 6] ]它由一个 2 级 Stream 或一个二维数组组成 。 在 Java 8 中&#xff0c;我们可以使用 flatMap…

前端工程师leetcode算法面试必备-二分搜索算法(下)

一、287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。 1、HashMap 在没有其它附加条件的情况下&…

直属领导和老板都给了我绩效A,HR最后审核时降成了B,平时没有得罪她,她为什么这么做?...

绩效考核时&#xff0c;谁才是最终决定你绩效那个人&#xff1f;一位网友最近遇到了这样一件糟心事&#xff1a;季度绩效&#xff0c;直属领导和老板都给了A&#xff0c;人事最后审核时给降成了B&#xff0c;平时和人事没什么工作交集&#xff0c;按理说没有得罪她&#xff0c;…

Java工具——MySQL介绍与安装

Java工具——MySQL介绍与安装MySQL数据库介绍1. 简介2. MySQL发展历史MySQL数据库安装1. 下载安装包2. 安装3. 配置环境变量MySQL数据库介绍 1. 简介 MySQL是应用最广泛、普及度最高的开源关系型数据库&#xff0c;MySQL由瑞典MySQL AB公司开发&#xff0c;目前属于Oracle旗下…

Opencv 基本操作七 提取两幅图像的重叠区域

使用opencv提取连个图像的重叠区域&#xff0c;其本质就是提取两个图像的特征点&#xff0c;然后对两个图像的特征点进行匹配&#xff0c;根据匹配的特征点计算出透视变换矩阵H&#xff0c;然后根据H即可提取出两个图像的重叠区域。这里要注意的是&#xff0c;普通的opencv库没…

Kali Linux断网攻击

前言 ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生大量的ARP通信量使网络阻塞&#xff0c;攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目&#xff0c;造成网络中断或中间人攻击。 一句话解释&#xff1a; 断…

2022年总结 | 从初二学生到算法作者的蜕变之路

目录 一年的创作历程 我和 CSDN 在编程竞赛的合作 About CBC 技术社区的发展 夜跑奇遇 About 博客之星 新年致谢 元旦祝福 一年的创作历程 2022年&#xff0c;这一年对于我来说是十分重要的一年。在这一年里&#xff0c;我作为一名初二在校学生&#xff0c;在CSDN上发布…

2003-2021年高铁站开通时间

2003-2021年高铁站开通时间数据 1、时间&#xff1a;2003-2021年 2、指标&#xff1a;高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注 3、指标说明&#xff1a; 高速铁路&#xff0c;简称高铁&#xff0c;是指设计标准等级高、可供列车安全高速行驶…

需要提醒你关于 golang 中 map 使用的几点注意事项

日常的开发工作中&#xff0c;map 这个数据结构相信大家并不陌生&#xff0c;在 golang 里面&#xff0c;当然也有 map 这种类型 关于 map 的使用&#xff0c;还是有蛮多注意事项的&#xff0c;如果不清楚&#xff0c;这些事项&#xff0c;关键时候可能会踩坑&#xff0c;我们…