ES的安装和RestClient的操作

目录

初识elasticsearch

什么是elasticsearch

elasticsearch的发展

Lucene的优缺点

elasticsearch的优势

倒排索引 

es与mysql的概念对比

文档

索引

概念对比

架构

安装es

安装kibana

安装ik分词器 

分词器

安装ik分词器

ik分词器的拓展和停用词典

操作索引库

mapping属性

创建索引库

查询、删除、修改索引库

文档操作

新增查询删除文档

修改文档

方法一:全量修改

方法二:增量修改

RestClient的操作

什么是RestClient

hotel数据结构分析

索引库操作

初始化JavaRestClient

创建索引库

删除索引库

判断索引库是否存在

文档操作

初始化JavaRestClient

添加文档

查询文档

修改文档

删除文档

批量导入文档


什么是elasticsearch?
1、一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能
什么是elastic stack (ELK) ?
2、是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch
什么是Lucene?
3、是Apache的开源搜索引擎类库,提供了搜索引擎的核心API


什么是文档和词条?

1、每一条数据就是一个文档
2、对文档中的内容分词,得到的词语就是词条
什么是正向索引?
1、基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条
什么是倒排索引?
1、对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档


文档:一条数据就是一个文档,es中是Json格式
字段:Json文档中的字段
索引:同类型文档的集合
映射:索引中文档的约束,比如字段名称、类型
elasticsearch与数据库的关系:
1、数据库负责事务类型操作
2、elasticsearch负责海量数据的搜索、分析、计算


分词器的作用是什么?
1、创建倒排索引时对文档分词
2、用户搜索时,对输入的内容分词
IK分词器有几种模式?
1、ik_smart:智能切分,粗粒度

2、ik_max_word:最细切分,细粒度
IK分词器如何拓展词条?如何停用词条?
1、利用config目录的lkAnalyzer.cfg.xml文件添加拓展词典和停用词典

2、在词典中添加拓展词条或者停用词条


mapping常见属性有哪些?

1、type:数据类型
2、index:是否索引

3、analyzer:分词器

4、properties:子字段

type常见的有哪些?

1、字符串:text、keyword
2、数字:long、integer、short、 byte、double、float

3、布尔:boolean
4、日期:date
5、对象:object


索引库操作有哪些?
1、创建索引库:PUT/索引库名
2、查询索引库:GET/索引库名
3、删除索引库:DELETE/索引库名
4、添加字段:PUT/索引库名/_mapping


文档操作有哪些?
1、创建文档:POST/索引库名/_doc/文档id { json文档}
2、查询文档:GET/索引库名/_doc/文档id
3、删除文档:DELETE/索引库名/_doc/文档id
4、修改文档:
全量修改:PUT/索引库名/_doc/文档id { json文档}
增量修改:POST/索引库名/_update/文档id { "doc":{字段}}


索引库操作的基本步骤:
1、初始化RestHighLevelClient
2、创建XxxIndexRequest。XXX是CREATE、Get、Delete
3、准备DSL ( CREATE时需要)
4、发送请求。调用RestHighLevelClient#tindices().xxx()方法,xxx是create、exists、delete


文档操作的基本步骤:
1、初始化RestHighLevelClient
2、创建XxxRequest。XXX是Index、Get、Update、Delete
3、准备参数((Index和Update时需要)
4、发送请求。调用RestHighLevelClient#t.xxx()方法,xxx是index、get、update、delete
5、解析结果(Get时需要)

初识elasticsearch

什么是elasticsearch

elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。

elasticsearch结合kibana、Logstash、Beats,也就是elastic stack (ELK)。被广泛应用在日志数据分析、实时监控等领域。
elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。

elasticsearch的发展

Lucene的优缺点

Lucene的优势:

1、易扩展
2、高性能(基于倒排索引)

Lucene的缺点:
1、只限于Java语言开发

2、学习曲线陡峭
3、不支持水平扩展 

elasticsearch的优势

相比与lucene, elasticsearch具备下列优势:

1、支持分布式,可水平扩展
2、提供Restful接口,可被任何语言调用

倒排索引 

elasticsearch采用倒排索引:
1、文档(document):每条数据就是一个文档

2、词条(term):文档按照语义分成的词语

es与mysql的概念对比

文档

1、elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。

2、文档数据会被序列化为json格式后存储在elasticsearch中。 

索引

索引 ( index):相同类型的文档的集合
映射(mapping):索引中文档的字段约束信息,类似表的结构约束

概念对比

MySQLElasticsearch说明
TableIndex索引(index),就是文档的集合,类似数据库的表(table)
RowDocument文档(Document),就是一条条的数据,类似数据库中的行(ROW),文档都是JSON格式
ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQLDSLDSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

架构

Mysql:擅长事务类型操作,可以确保数据的安全和一致性

Elasticsearch:擅长海量数据的搜索、分析、计算

安装es

创建网络:es-net是自己取的名字,随便取

docker network create es-net

加载镜像:使用提供的es.tar,拖到虚拟机的tmp目录下  

es.taricon-default.png?t=N7T8https://pan.baidu.com/s/13Z74D-liQaDL0_tM-Rl7Rg?pwd=47qm运行加载命令:

docker load -i es.tar

运行docker命令:

docker run -d \
    --name es \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1

访问网页:虚拟机ip和9200端口。成功

安装kibana

加载镜像:使用提供的es.tar,拖到虚拟机的tmp目录下  

kibanaicon-default.png?t=N7T8https://pan.baidu.com/s/1N3NiLRxLzX42jMxkK9ackQ?pwd=lh2y运行docker命令

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601  \
kibana:7.12.1

访问网页:虚拟机ip和5601端口。成功

点击主页的Explore on my own后,打开Dev Tools

模拟一次请求:可以看到右边的数据和端口9200的数据一模一样 

安装ik分词器 

分词器

es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。

语法说明:
POST:请求方式
/_analyze:请求路径

请求参数,json风格:analyzer:分词器类型。text:要分词的内容 

我们可以看到:右边的数据分词并不友好,比如:世界本应该是一起的,它却分开了

安装ik分词器

查看es-plugins数据卷所在的位置

docker volume inspect es-plugins 

把ik文件夹放到该路径:Mountpoint就是要的位置

ik文件夹icon-default.png?t=N7T8https://pan.baidu.com/s/1EIkGJDvVjcGx06hDUo34Eg?pwd=dads重启es

docker restart es

测试

ik_smart:最少切分

ik_max_word:最细切分  

ik_smart:从最多字开始判断是否切分,若切分,则不会再继续判断已被切分的词是否继续切分 

ik_max_word:会判断每个词是否能再继续分 

ik分词器的拓展和停用词典

修改一个ik分词器目录中的config目录中的lkAnalyzer.cfg.xml文件

在第一个箭头这行,添加ext.dic:这是要用来拓展词典的文件,要在lkAnalyzer.cfg.xml所在的同级目录下创建出来。

在第二个箭头这行,添加stopword.dic:这是要用来停用词典的文件,在lkAnalyzer.cfg.xml所在的同级目录已经创建好了,不需要再创建。

在ext.dic添加要拓展的词典

在stopword.dic添加要停用的词典

重启es:这次重启后,需要几十秒的时间才能访问网站,否则网站会报错

docker restart es 

再次访问网站,可以看到这次测试“奥利给”并没有被分开,并且“的”字并没有出现在右边。

是因为“奥利给”被写进了ext.dic, “的”被写进了stopword.dic

操作索引库

mapping属性

mapping是对索引库中文档的约束,常见的mapping属性包括:

1、type:字段数据类型,常见的简单类型有:
1.1、字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

1.2、数值:long、integer、short、byte、double、float

1.3、布尔:boolean
1.4、日期:date

1.5、对象:object

2、index:是否创建索引,默认为true

3、analyzer:使用哪种分词器
4、properties:该字段的子字段

创建索引库

这里创建了一个名叫heima的索引库,mappings代表它是做映射的,properties代表里面是具体的字段,type代表该字段的数据类型,analyzer代表该字段的分词器,index代表该字段是否创建索引

PUT /heima
{
  "mappings": {
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email": {
        "type": "keyword",
        "index": false
      },
      "name": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": "keyword"
          },
          "lastName": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

运行该DSL语句后,右边会出现创建的索引库名字,代表创建成功

查询、删除、修改索引库

查看索引库语法

GET /索引库名称 

删除索引库语法 

DELETE /索引库名

索引库和mapping一旦创建无法修改,但是可以添加新的字段

PUT /索引库名称/_mapping
{
  "properties": {
    "新字段名": {
    }
  }
}

文档操作

新增查询删除文档

新增文档语法

POST /索引库名/_doc/文档id
{
  "字段1": "值1",
  "字段2": "值2",
  "字段3": {
    "子属性1": "值3",
    "子属性2": "值4"
  }
}

新增文档,右边的数据result为created。成功 

查询文档语法

GET /索引库名/_doc/文档id 

查询文档,右边会出现文档的数据。成功

删除文档语法

DELETE /索引库名/_doc/文档id

删除文档,右边数据result为deleted,成功 

修改文档

方法一:全量修改

会删除旧文档,添加新文档

PUT /索引库名/_doc/文档id
{
  "字段1": "值1",
  "字段2": "值2"

当文档存在时:修改后,右边的数据result为updated。修改成功

当文档不存在时:修改变成了创建。

方法二:增量修改

修改指定的字段,注意只能写指定的字段,而不是把所有字段都写上

POST /索引库名/_update/文档id
{
  "doc": {
    "字段1": "值1"
  }

修改后,右边的result为updated。修改成功 

RestClient的操作

什么是RestClient

ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。

下载提供的资料

hotel的demo和sqlicon-default.png?t=N7T8https://pan.baidu.com/s/1uxl7PzshHu09PXsd9zDWbA?pwd=v8bf在本地新建一个数据库:heima,若使用其他数据库名,记得在demo里修改yml文件 

hotel数据结构分析

写出数据库中该表的DSL语句,但是不要执行。我们要使用java来执行

PUT /hotel
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "address": {
        "type": "keyword",
        "index": false
      },
      "price": {
        "type": "integer"
      },
      "score": {
        "type": "integer"
      },
      "brand": {
        "type": "keyword",
        "copy_to": "all"
      },
      "city": {
        "type": "keyword"
      },
      "starName": {
        "type": "keyword"
      },
      "business": {
        "type": "keyword",
        "copy_to": "all"
      },
      "location": {
        "type": "geo_point"
      },
      "pic": {
        "type": "keyword",
        "index": false
      },
      "all": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }

索引库操作

初始化JavaRestClient

在hotel.pom文件中引入es的RestHighLevelclient依赖

<!--elasticsearch-->
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本

<properties><java.version>1.8</java.version><elasticsearch.version>7.12.1</elasticsearch.version>
</properties> 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.10.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.itcast.demo</groupId><artifactId>hotel-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>hotel-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><elasticsearch.version>7.12.1</elasticsearch.version></properties><dependencies><!--elasticsearch--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--FastJson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.71</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

初始化RestHighLevelClient:xxx填虚拟机ip

RestHighLevelclient client = new RestHighLevelclgent(RestClient.builder(
        HttpHost.create( "http://xxx.xxx.xxx.xxx:9200")
) );

该代码我写成了

@BeforeEach
void setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));
}@AfterEach
void tearDown() throws IOException {this.client.close();
}
package cn.itcast.hotel;import net.sf.jsqlparser.statement.create.index.CreateIndex;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;public class HotelIndexTest {private RestHighLevelClient client;@Testvoid testInit() {System.out.println(client);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

创建索引库

这个MAPPING_TEMPLATE的位置是要填写DSL语句,但因为太长,我就把它写成了常量

@Test
void createHotelIndex() throws IOException {//1、创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");//2、准备请求的参数,DSL语句request.source(MAPPING_TEMPLATE, XContentType.JSON);//3、发送请求client.indices().create(request, RequestOptions.DEFAULT);
} 
package cn.itcast.hotel;import net.sf.jsqlparser.statement.create.index.CreateIndex;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;public class HotelIndexTest {private RestHighLevelClient client;@Testvoid testInit() {System.out.println(client);}@Testvoid createHotelIndex() throws IOException {//1、创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");//2、准备请求的参数,DSL语句request.source(MAPPING_TEMPLATE, XContentType.JSON);//3、发送请求client.indices().create(request, RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}
public static final String MAPPING_TEMPLATE = "";
package cn.itcast.hotel.constants;public class HotelConstants {public static final String MAPPING_TEMPLATE = "{\n" +"  \"mappings\": {\n" +"    \"properties\": {\n" +"      \"id\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"name\": {\n" +"        \"type\": \"text\",\n" +"        \"analyzer\": \"ik_max_word\",\n" +"        \"copy_to\": \"all\"\n" +"      },\n" +"      \"address\": {\n" +"        \"type\": \"keyword\",\n" +"        \"index\": false\n" +"      },\n" +"      \"price\": {\n" +"        \"type\": \"integer\"\n" +"      },\n" +"      \"score\": {\n" +"        \"type\": \"integer\"\n" +"      },\n" +"      \"brand\": {\n" +"        \"type\": \"keyword\",\n" +"        \"copy_to\": \"all\"\n" +"      },\n" +"      \"city\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"starName\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"business\": {\n" +"        \"type\": \"keyword\",\n" +"        \"copy_to\": \"all\"\n" +"      },\n" +"      \"location\": {\n" +"        \"type\": \"geo_point\"\n" +"      },\n" +"      \"pic\": {\n" +"        \"type\": \"keyword\",\n" +"        \"index\": false\n" +"      },\n" +"      \"all\": {\n" +"        \"type\": \"text\",\n" +"        \"analyzer\": \"ik_max_word\"\n" +"      }\n" +"    }\n" +"  }\n" +"}";
}

运行测试代码,可以看到控制台运行成功。

删除索引库

@Test
void testDeleteHotelIndex() throws IOException {//1、创建Request对象DeleteIndexRequest request = new DeleteIndexRequest("hotel");//2、发送请求client.indices().delete(request, RequestOptions.DEFAULT);
}
package cn.itcast.hotel;import net.sf.jsqlparser.statement.create.index.CreateIndex;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;public class HotelIndexTest {private RestHighLevelClient client;@Testvoid testInit() {System.out.println(client);}@Testvoid createHotelIndex() throws IOException {//1、创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");//2、准备请求的参数,DSL语句request.source(MAPPING_TEMPLATE, XContentType.JSON);//3、发送请求client.indices().create(request, RequestOptions.DEFAULT);}@Testvoid testDeleteHotelIndex() throws IOException {//1、创建Request对象DeleteIndexRequest request = new DeleteIndexRequest("hotel");//2、发送请求client.indices().delete(request, RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

 点击该测试,控制台运行成功。 

判断索引库是否存在

@Test
void testExistsHotelIndex() throws IOException {//1、创建Request对象GetIndexRequest request = new GetIndexRequest("hotel");//2、发送请求boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);//3、输出System.err.println(exists ? "索引库存在" : "索引库不存在");
}
package cn.itcast.hotel;import net.sf.jsqlparser.statement.create.index.CreateIndex;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;public class HotelIndexTest {private RestHighLevelClient client;@Testvoid testInit() {System.out.println(client);}@Testvoid createHotelIndex() throws IOException {//1、创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");//2、准备请求的参数,DSL语句request.source(MAPPING_TEMPLATE, XContentType.JSON);//3、发送请求client.indices().create(request, RequestOptions.DEFAULT);}@Testvoid testDeleteHotelIndex() throws IOException {//1、创建Request对象DeleteIndexRequest request = new DeleteIndexRequest("hotel");//2、发送请求client.indices().delete(request, RequestOptions.DEFAULT);}@Testvoid testExistsHotelIndex() throws IOException {//1、创建Request对象GetIndexRequest request = new GetIndexRequest("hotel");//2、发送请求boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);//3、输出System.err.println(exists ? "索引库存在" : "索引库不存在");}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

运行该测试,控制台运行成功,并且打印了“索引库不存在”,因为刚刚删除了索引库

文档操作

初始化JavaRestClient

xxx写虚拟机ip

    @BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
@SpringBootTest
public class HotelDocumentTest {@Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

添加文档

@Test
void testAddDocument() throws IOException {//根据id查询酒店数据Hotel hotel = hotelService.getById(61083L);//转换成文档类型HotelDoc hotelDoc = new HotelDoc(hotel);//1、准备Request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());//2、准备json文档request.source("{\"name"\:\"Jack\",\"age\":21}",XContentType.JSON);//3、发送请求client.index(request,RequestOptions.DEFAULT);
} 

我这里的第二步用的是实体类转JSON的方式 

package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;@SpringBootTest
public class HotelDocumentTest {@Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;@Testvoid testAddDocument() throws IOException {//根据id查询酒店数据Hotel hotel = hotelService.getById(61083L);//转换成文档类型HotelDoc hotelDoc = new HotelDoc(hotel);//1、准备Request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());//2、准备json文档request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);//3、发送请求client.index(request,RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

实体类

package cn.itcast.hotel.pojo;import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
public class HotelDoc {private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String location;private String pic;public HotelDoc(Hotel hotel) {this.id = hotel.getId();this.name = hotel.getName();this.address = hotel.getAddress();this.price = hotel.getPrice();this.score = hotel.getScore();this.brand = hotel.getBrand();this.city = hotel.getCity();this.starName = hotel.getStarName();this.business = hotel.getBusiness();this.location = hotel.getLatitude() + ", " + hotel.getLongitude();this.pic = hotel.getPic();}
}

运行该测试,控制台运行成功

查询文档

@Test
void testGetDocumentById() throws IOException {//1、准备RequestGetRequest request = new GetRequest("hotel", "61083");//2、发送请求,得到响应GetResponse response = client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json = response.getSourceAsString();//反序列化HotelDoc hotelDoc = JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);
}
package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;@SpringBootTest
public class HotelDocumentTest {@Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;@Testvoid testAddDocument() throws IOException {//根据id查询酒店数据Hotel hotel = hotelService.getById(61083L);//转换成文档类型HotelDoc hotelDoc = new HotelDoc(hotel);//1、准备Request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());//2、准备json文档request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);//3、发送请求client.index(request,RequestOptions.DEFAULT);}@Testvoid testGetDocumentById() throws IOException {//1、准备RequestGetRequest request = new GetRequest("hotel", "61083");//2、发送请求,得到响应GetResponse response = client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json = response.getSourceAsString();//反序列化HotelDoc hotelDoc = JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

运行该测试,控制台运行成功,并且把数据打印了出来

修改文档

这里我只演示局部更新 

@Test
void testUpdateDocument() throws IOException {//1、准备RequestUpdateRequest request = new UpdateRequest("hotel", "61083");//2、准备请求参数request.doc("price", "952","starName", "四钻");//3、发送请求client.update(request,RequestOptions.DEFAULT);
}
package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;@SpringBootTest
public class HotelDocumentTest {@Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;@Testvoid testAddDocument() throws IOException {//根据id查询酒店数据Hotel hotel = hotelService.getById(61083L);//转换成文档类型HotelDoc hotelDoc = new HotelDoc(hotel);//1、准备Request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());//2、准备json文档request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);//3、发送请求client.index(request,RequestOptions.DEFAULT);}@Testvoid testGetDocumentById() throws IOException {//1、准备RequestGetRequest request = new GetRequest("hotel", "61083");//2、发送请求,得到响应GetResponse response = client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json = response.getSourceAsString();//反序列化HotelDoc hotelDoc = JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}@Testvoid testUpdateDocument() throws IOException {//1、准备RequestUpdateRequest request = new UpdateRequest("hotel", "61083");//2、准备请求参数request.doc("price", "952","starName", "四钻");//3、发送请求client.update(request,RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

运行该测试,控制台运行成功

删除文档

@Test
void testDeleteDocument() throws IOException {//1、准备RequestDeleteRequest request = new DeleteRequest("hotel", "61083");//2、发送请求client.delete(request,RequestOptions.DEFAULT);
}
package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;@SpringBootTest
public class HotelDocumentTest {@Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;@Testvoid testAddDocument() throws IOException {//根据id查询酒店数据Hotel hotel = hotelService.getById(61083L);//转换成文档类型HotelDoc hotelDoc = new HotelDoc(hotel);//1、准备Request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());//2、准备json文档request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);//3、发送请求client.index(request,RequestOptions.DEFAULT);}@Testvoid testGetDocumentById() throws IOException {//1、准备RequestGetRequest request = new GetRequest("hotel", "61083");//2、发送请求,得到响应GetResponse response = client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json = response.getSourceAsString();//反序列化HotelDoc hotelDoc = JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}@Testvoid testUpdateDocument() throws IOException {//1、准备RequestUpdateRequest request = new UpdateRequest("hotel", "61083");//2、准备请求参数request.doc("price", "952","starName", "四钻");//3、发送请求client.update(request,RequestOptions.DEFAULT);}@Testvoid testDeleteDocument() throws IOException {//1、准备RequestDeleteRequest request = new DeleteRequest("hotel", "61083");//2、发送请求client.delete(request,RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

运行该测试,控制台运行成功

批量导入文档

@Test
void testBulkRequest() throws IOException {//1、创建RequestBulkRequest request = new BulkRequest();//2、准备参数,添加多个新增的Request,这里添加两个数据,分别是id为101和102的数据request.add(new IndexRequest("hotel").id("101").source("json source", XContentType.JSON));request.add(new IndexRequest("hotel").id("102").source("json source", XContentType.JSON));//3、发送请求client.bulk(request,RequestOptions.DEFAULT);
}

我这里改成这样,是因为我要把该表的所有数据都导入文档

 @Test
    void testBulkRequest() throws IOException {
        //批量查询酒店数据
        List<Hotel> hotels = hotelService.list();
        //1、创建Request
        BulkRequest request = new BulkRequest();
        //2、准备参数,添加多个新增的Request
        for(Hotel hotel:hotels){
            //转换为文档类型HotelDoc
            HotelDoc hotelDoc = new HotelDoc(hotel);
            //创建新增文档的Request对象
            request.add(new IndexRequest("hotel")
            .id(hotelDoc.getId().toString())
            .source(JSON.toJSONString(hotelDoc),XContentType.JSON));
        }
        //3、发送请求
        client.bulk(request,RequestOptions.DEFAULT);
    }

package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;@SpringBootTest
public class HotelDocumentTest {@Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;@Testvoid testAddDocument() throws IOException {//根据id查询酒店数据Hotel hotel = hotelService.getById(61083L);//转换成文档类型HotelDoc hotelDoc = new HotelDoc(hotel);//1、准备Request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());//2、准备json文档request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);//3、发送请求client.index(request,RequestOptions.DEFAULT);}@Testvoid testGetDocumentById() throws IOException {//1、准备RequestGetRequest request = new GetRequest("hotel", "61083");//2、发送请求,得到响应GetResponse response = client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json = response.getSourceAsString();//反序列化HotelDoc hotelDoc = JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}@Testvoid testUpdateDocument() throws IOException {//1、准备RequestUpdateRequest request = new UpdateRequest("hotel", "61083");//2、准备请求参数request.doc("price", "952","starName", "四钻");//3、发送请求client.update(request,RequestOptions.DEFAULT);}@Testvoid testDeleteDocument() throws IOException {//1、准备RequestDeleteRequest request = new DeleteRequest("hotel", "61083");//2、发送请求client.delete(request,RequestOptions.DEFAULT);}@Testvoid testBulkRequest() throws IOException {//批量查询酒店数据List<Hotel> hotels = hotelService.list();//1、创建RequestBulkRequest request = new BulkRequest();//2、准备参数,添加多个新增的Requestfor(Hotel hotel:hotels){//转换为文档类型HotelDocHotelDoc hotelDoc = new HotelDoc(hotel);//创建新增文档的Request对象request.add(new IndexRequest("hotel").id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));}//3、发送请求client.bulk(request,RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://xxx.xxx.xxx.xxx:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}
}

运行该测试,控制台运行成功,并且可以看到导入了201条数据,正好表的数据量

代码文件点击下载icon-default.png?t=N7T8https://pan.baidu.com/s/1NJnwlfThymqPRhqWqqP0FQ?pwd=6c0n 上一篇:SpringAMQP的配置和使用

 

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

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

相关文章

深度 | 智慧•城市,基于国际视野下的思考

来源&#xff1a;智慧城市决策参考智慧城市的兴起&#xff0c;得益于ICT技术的迅猛发展。经过这些年国内外诸多城市的探索和实践&#xff0c;智慧城市已经从最初的营销概念&#xff0c;逐渐发展成为一种支持城市发展的新理念。然而在实际应用中&#xff0c;智慧城市的内涵仍然是…

__cdecl、__stdcall、__fastcall 与 __pascal 浅析

X86调用约定 calling convention&#xff1a;https://www.cnblogs.com/shangdawei/p/3323252.html__cdecl、__stdcall、__fastcall 与 __pascal 浅析&#xff1a;https://www.cnblogs.com/yenyuloong/p/9626658.html王爽 汇编语言第三版 第9章 转移指令的原理&#xff1a;https…

全文详解:「深度学习」如何协助处理医疗中的「数据难题」

原文来源&#xff1a;WordPress作者&#xff1a;Luke Oakden-Rayner「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA、EVA医疗数据很难处理。在医学成像中&#xff0c;数据存储&#xff08;档案&#xff09;是基于临床假设进行操作的。不幸的是&#xff0c;这意味着当你想提…

Android应用程序变量

Android应用程序开发中&#xff0c;有的时候我们在应用程序的任何一个地方都需要访问一个全局变量&#xff0c;也就是在任何一个Activity中都可以访问的变量。它不会因为Activity的生命周期结束而消失。要实现应用程序级的变量&#xff0c;我们可以通过Application这个类来实现…

百度谷歌等联合推出机器学习基准 加速AI软硬件发展

来源&#xff1a;中国新闻网5月2日&#xff0c;由包括百度、谷歌、斯坦福大学、哈佛大学在内的多家企业和高校联合发布了一套用于测量和提高机器学习软硬件性能的国际基准MLPerf。其巨大的学术和产业价值获业界肯定&#xff0c;被认为不仅将加速推进机器学习硬件软件相关技术创…

王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计

第10章 call 和 ret 指令 10.1 ret 和 reft 指令 call 和 ret 指令都是转移指令&#xff0c;他们都修改 IP&#xff0c;或同事修改 CS 和 IP 。他们经常被共同来实现子程序的设计。 10.2 call 指令 和 根据位移 转移的call指令 段间转移 的 call 指令 转移地址 在 寄存器 中 的…

org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0

一、错误现象&#xff1a; 当改变了jdk版本时&#xff0c;在编译java时&#xff0c;会遇到Unsupported major.minor version错误。 jdk版本和stanford parser对应关系 JDK版本和Java编译器内部的版本号 J2SE 8 52, J2SE 7 51, J2SE 6.0 50, J2SE 5.0 49, JDK 1.4 48, J…

ip, tcp, udp, icmp header

Figure 1. IPv4 header Figure 2. TCP header Figure 3. UDP header Figure 4. ICMP header reference:TCP/IP Reference转载于:https://www.cnblogs.com/lbsx/archive/2010/11/30/1891814.html

人民日报三问人工智能,给法律制度带来哪些挑战?

来源&#xff1a;亿欧网 作者&#xff1a;倪弋摘要&#xff1a;人工智能生成物是否具有知识产权&#xff1f;人工智能可以替代司法者吗&#xff1f;人工智能侵权责任如何认定&#xff1f;人工智能的出现会给现行的法律制度带来了不少挑战&#xff0c;只有在法律研究上未雨绸缪…

测试用例设计--判定表

一. 判定表 定义判定表通常由四部分组成&#xff0c;如上图&#xff1a; 条件桩 : 它列出决定一组条件的对象&#xff1b; 条件项: 它列出各种可能的条件组合&#xff1b; 动作桩: 它列出所有的操作; 动作项: 它列出在对应的条件组合下的动作. 应用的范围在多个条件决定多个动…

王爽 汇编语言第三版 第11章 标志寄存器

条件码&#xff1a; ① OF(Overflow Flag)溢出标志&#xff0c;溢出时为1&#xff0c;否则置0.标明一个溢出了的计算&#xff0c;如:结构和目标不匹配.② SF(Sign Flag)符号标志&#xff0c;结果为负时置1&#xff0c;否则置0.③ ZF(Zero Flag)零标志&#xff0c;运算结果为0时…

Gartner:预计2018年人工智能行业总价值达1.2万亿美元

来源&#xff1a;网络大数据市场研究公司Gartner周三发布最新研究报告称&#xff0c;人工智能行业的总价值将在2018年达到1.2万亿美元&#xff0c;比2017年增长70%。其中&#xff0c;创造商业价值最大的领域是客户体验解决方案。该公司还预计&#xff0c;到2022年的时候&#x…

JAVA将html[动态]页面转成图片

近日项目上接到一个任务&#xff0c;设计并编写住院病案首页页面&#xff0c;然后将其转换成图片显示给医生查看。 天哪&#xff0c;住院病案内容那么多&#xff0c;光编写这个页面就已经够呛了&#xff0c;转图片我也没弄过&#xff0c;于是百度了一下&#xff0c;花了两天时间…

王爽 汇编语言第三版 课程设计 1

From&#xff1a;https://www.cnblogs.com/Since-natural-ran/p/6938133.html 汇编语言-课程设计1: https://www.cnblogs.com/tsembrace/p/3267158.html 王爽课程设计1(汇编语言编写): https://www.imooc.com/article/18785 王爽《汇编语言》课程设计1: https://blog.csdn.net/…

挑战权威还是偏离主流?颠覆性研究或将证明神经信号是机械波

来源&#xff1a;科研圈 翻译 马骁骁 编辑 魏潇 廖红艳就职于哥本哈根尼尔斯玻尔研究所&#xff08;Niels Bohr Institute&#xff09;的托马斯亨伯格&#xff08;Thomas Heimburg&#xff09;&#xff0c;是一位研究量子力学和生物物理的物理学家。然而&#xff0c;他却希…

史上最全的女人坐月子注意事項

希望男人们要精心照顾好妻子&#xff0c;让妻子平安度过这一时期&#xff0c;为了宝宝&#xff0c;为了你们的幸福&#xff0c;因为你爱她就要呵护她&#xff0c;她好你也好&#xff0c;她平安就是你们全家的幸福&#xff0c;精致女人把祝福送给你们&#xff01; 传统上人们将产…

斯坦福大学、DARPA与硅谷公司共同分析前沿科技发展趋势

来源&#xff1a;科技日报 作者&#xff1a;张梦然日前&#xff0c;斯坦福大学研究团队、美国国防部高级研究计划局&#xff08;DARPA&#xff09;以及硅谷创投公司和米资本的专家们&#xff0c;共同研讨了技术将如何重塑行业和社会等问题。他们分析了现今全球前沿科技的未来…

小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe

小甲鱼 视频教程&#xff08; 4、5 集 &#xff09;&#xff1a;https://www.bilibili.com/video/av6889190?p4 实验程序 reverseME.exe 下载地址&#xff1a;https://pan.baidu.com/s/18NDV3rQ_yV_qzUrNRYmqjA 提取码&#xff1a;e91j http://www.360doc.com/content/1…

java将字符串生成图片

java将字符串保存为图片 因为最近接触到的需求是要将指定的字符串内容保存为图片&#xff0c;我知道肯定要用awt相关的东西&#xff0c;但是以前没有接触过awt&#xff0c;所以只能去网上学习相关的东西和找有关的资料&#xff0c;好在最后可以解决&#xff0c;直接上代码&…

AI 综述专栏 | 超长综述让你走近深度人脸识别

来源&#xff1a;人工智能前沿讲习班 作者&#xff1a; 葛政相信做机器学习或深度学习的同学们回家总会有这样一个烦恼&#xff1a;亲朋好友询问你从事什么工作的时候&#xff0c;如何通俗地解释能避免尴尬&#xff1f;我尝试过很多名词来形容自己的工作&#xff1a;机器学习&…