Elasticsearch之RestClient的简单操作(附java代码案例)

news2024/9/23 11:27:00

目录

前言

1. 案例Demo前期准备

1.1 sql数据

1.2 项目结构

1.3 mapping映射分析

1.4 初始化RestClient

2.索引库操作

2.1 创建索引库

2.1.1 代码解读

2.1.2 完整代码示例

2.2 判断索引库是否存在

2.3 删除索引库操作

2.4 索引库操作总结

3.RestClient操作文档

3.1 新增文档

3.1.1 索引库实体类

3.1.2 语法说明

3.1.3 完整代码

3.2 查询文档

3.2.1 语法说明

3.2.2 完整代码

3.3 删除文档

3.4 修改文档

3.4.1 语法说明

3.4.2 完整代码

3.5 批量导入文档

3.5.1 语法说明

3.5.2 完整代码

3.6 文档操作总结


前言

ES官方提供了各种不同语言的客户端,来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:Elasticsearch Clients | Elastic 。

其中的Java Rest Client又包括两种:

  • Java Low Level Rest Client

  • Java High Level Rest Client

本文介绍的就是Java HighLevel Rest Client客户端API。

1. 案例Demo前期准备

本文用的Hotel-Demo可以在我的百度网盘中下载。

链接: https://pan.baidu.com/s/1zkih8w6prpiQNbQ-j_F93w?pwd=1234

提取码: 1234

1.1 sql数据

这里用到的是tb_hotel.sql,数据结构如下:

CREATE TABLE `tb_hotel` (
  `id` bigint(20) NOT NULL COMMENT '酒店id',
  `name` varchar(255) NOT NULL COMMENT '酒店名称;例:7天酒店',
  `address` varchar(255) NOT NULL COMMENT '酒店地址;例:航头路',
  `price` int(10) NOT NULL COMMENT '酒店价格;例:329',
  `score` int(2) NOT NULL COMMENT '酒店评分;例:45,就是4.5分',
  `brand` varchar(32) NOT NULL COMMENT '酒店品牌;例:如家',
  `city` varchar(32) NOT NULL COMMENT '所在城市;例:上海',
  `star_name` varchar(16) DEFAULT NULL COMMENT '酒店星级,从低到高分别是:1星到5星,1钻到5钻',
  `business` varchar(255) DEFAULT NULL COMMENT '商圈;例:虹桥',
  `latitude` varchar(32) NOT NULL COMMENT '纬度;例:31.2497',
  `longitude` varchar(32) NOT NULL COMMENT '经度;例:120.3925',
  `pic` varchar(255) DEFAULT NULL COMMENT '酒店图片;例:/img/1.jpg',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

1.2 项目结构

项目结构如图:

这里的mysql配置都是我自己的数据库,你们如果上传的数据不同的话,记得修改这里。url,用户名,密码都检查一遍,不然会报错。

1.3 mapping映射分析

创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:

  • 字段名
  • 字段数据类型
  • 是否参与搜索
  • 是否需要分词
  • 如果分词,分词器是什么?

其中:

  • 字段名、字段数据类型,可以参考数据表结构的名称和类型
  • 是否参与搜索要分析业务来判断,例如图片地址,就无需参与搜索
  • 是否分词呢要看内容,内容如果是一个整体就无需分词,反之则要分词
  • 分词器,我们可以统一使用ik_max_word

来看下酒店数据的索引库结构:

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",
        "copy_to": "all"
      },
      "starName":{
        "type": "keyword"
      },
      "business":{
        "type": "keyword"
      },
      "location":{
        "type": "geo_point"
      },
      "pic":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

几个特殊字段说明:

  • id:酒店id,一般不允许分开,所以用的是keyword
  • location:地理坐标,里面包含精度、纬度
  • all:一个组合字段,其目的是将多字段的值 利用copy_to合并,提供给用户搜索

地理坐标说明:

copy_to说明:

1.4 初始化RestClient

在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。

分为三步:

1)引入es的RestHighLevleClient依赖:

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

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

<properties>
    <java.version>1.8</java.version>
    <elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

 3)初始化RestHighLevelClient:

初始化的代码如下:

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
        HttpHost.create("es部署的主机IP:9200")
));

这里为了单元测试方便,我们在cn.itcast.hotel包下创建一个测试类HotelIndexTest,然后将初始化的代码编写在@BeforeEach方法中:

package cn.itcast.hotel;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;

import java.io.IOException;

public class HotelIndexTest {
    private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("ES部署的主机IP:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }
}

2.索引库操作

2.1 创建索引库

2.1.1 代码解读

创捷索引库的代码如下:

代码分为三步:

1)创建Request对象。因为是创建索引库的操作,因此Request是CreateIndexRequest。

2)添加请求参数,其实就是DSL的JSON参数部分。因为JSON字符串有点长,这里定义了静态字符串常量MAPPING_TEMPLATE,让代码看起来更加优雅。

3)发送请求,client.indices()方法的返回值就是IndicesClient类型,里面封装了所有与索引库操作有关的方法。

2.1.2 完整代码示例

在hotel-demo的cn.itcast.hotel.constants包下,创建一个类,定义mapping映射的JSON字符串常量:

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" +
            "        \"copy_to\": \"all\"\n" +
            "      },\n" +
            "      \"starName\":{\n" +
            "        \"type\": \"keyword\",\n" +
            "        \"copy_to\": \"all\"\n" +
            "      },\n" +
            "      \"business\":{\n" +
            "        \"type\": \"keyword\"\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" +
            "}";
}

在hotel-demo中的HotelIndexTest测试类中,编写单元测试,实现创建索引:

@Test
void testCreateHotelIndex() throws IOException {
    //1. 创建Request对象
    CreateIndexRequest request = new CreateIndexRequest("hotel");
    //2. 准备请求参数
    request.source(MAPPING_TEMPLATE, XContentType.JSON);
    //3. 发送请求
    client.indices().create(request, RequestOptions.DEFAULT);
}

在es的图形图形化界面查询是否创建成功,可以看到下图:

2.2 判断索引库是否存在

判断索引库是否存在,本质就是查询,对应的DSL是:

GET /hotel

与创建索引库相比:

  • 请求方式从PUT变为GET
  • 请求路径不变
  • 无请求参数

所以代码的差异,注意体现在Request对象上。依然是三步走:

1)创建Request对象。这次是GetIndexRequest对象

2)准备参数。这里是无参

3)发送请求。改用exists方法

在hotel-demo中的HotelIndexTest测试类中,编写单元测试,实现判断索引是否存在:

@Test
void testExistsHotelIndex() throws IOException {
    //1.创建Request对象
    GetIndexRequest request = new GetIndexRequest("hotel");
    //2.发送请求
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    //3.输出判断结果
    System.out.println(exists ? "索引库存在!" : "索引库不存在!");
}

运行测试方法之后,可以在控制台看见:

2.3 删除索引库操作

删除索引库的DSL语句非常简单,与判断索引库是否存在一样:

DELETE /hotel

 因此删除索引库与判断索引库是否存在的Java代码流程是类似的。依然是三步走:

1)创建Request对象。这次是DeleteIndexRequest对象

2)准备参数。这里是无参

3)发送请求。改用delete方法

在hotel-demo中的HotelIndexTest测试类中,编写单元测试,实现删除索引:

@Test
void testDeleteHotelIndex() throws IOException {
    //1.创建Request对象
    DeleteIndexRequest request = new DeleteIndexRequest("hotel");
    //2.发送请求
    client.indices().delete(request,RequestOptions.DEFAULT);
}

运行完之后,我们去es的图形化kibana界面查询一下:

这里说没有找到hotel索引,说明被删除了。

2.4 索引库操作总结

JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。

索引库操作的基本步骤:

  • 初始化RestHighLevelClient

  • 创建XxxIndexRequest。XXX是Create、Get、Delete

  • 准备DSL( Create时需要,其它是无参)

  • 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete

特别需要注意的是,es索引库是不能修改已存在的字段,所以这里没有修改的方法。 

3.RestClient操作文档

为了与索引库操作分离,我们再次参加一个测试类,做两件事情:

  • 初始化RestHighLevelClient
  • 我们的酒店数据在数据库,需要利用IHotelService去查询,所以注入这个接口
package cn.itcast.hotel;

import cn.itcast.hotel.service.IHotelService;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@SpringBootTest
public class HotelDocumentTest {
    @Autowired
    private IHotelService hotelService;

    private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(
                RestClient.builder(
                        HttpHost.create("http://ES部署的主机IP:9200")
                ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }
}

3.1 新增文档

我们要将数据库的酒店数据查询出来,写入elasticsearch中。

3.1.1 索引库实体类

数据库查询后的结果是一个Hotel类型的对象。结构如下:

package cn.itcast.hotel.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("tb_hotel")
public class Hotel {
    @TableId(type = IdType.INPUT)
    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 longitude;
    private String latitude;
    private String pic;
}

与我们的索引库结构存在差异:

  • longitude和latitude需要合并为location

因此,我们需要定义一个新的类型,与索引库结构吻合:

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();
    }
}
3.1.2 语法说明

新增文档的DSL语句如下:

POST /{索引库名}/_doc/{文档编号}
{
  "info":"我欲扶摇九万里",
  "email":"hi@yahoo.com",
  "name":{
    "fistName":"yf",
    "lastName":"l"
  }
}

对应的java代码如图:

可以看到与创建索引库类似,同样是三步走:

1)创建Request对象

2)准备请求参数,也就是DSL中的JSON文档

3)发送请求

变化的地方在于,这里直接使用client.xxx()的API,不再需要client.indices()了。

3.1.3 完整代码

我们导入酒店数据,基本流程一致,但是需要考虑几点变化:

  • 酒店数据来自于数据库,我们需要先查询出来,得到hotel对象
  • hotel对象需要转为HotelDoc对象
  • HotelDoc需要序列化为json格式

因此,代码整体步骤如下:

1)根据id查询酒店数据Hotel

2)将Hotel封装为HotelDoc

3)将HotelDoc序列化为JSON

4)创建IndexRequest,指定索引库名和id

5)准备请求参数,也就是JSON文档

6)发送请求

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

@Test
void testCreateHotelDocument() throws IOException {
    //1.根据id查询酒店数据Hotel,id是数据库随便找的
    Hotel hotel = hotelService.getById(36934L);
    //2.将Hotel封装为HotelDoc
    HotelDoc hotelDoc = new HotelDoc(hotel);
    //3.创建IndexRequest对象,指定索引库名和id
    IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
    //4.准备请求参数,也就是json文档
    request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
    //5.发送请求
    client.index(request, RequestOptions.DEFAULT);
}

3.2 查询文档

3.2.1 语法说明

查询的DSL语句如下:

GET /hotel/_doc/{id}

非常简单,因此代码大概分两步:

  • 准备Request对象

  • 发送请求

不过查询的目的是得到结果,解析为HotelDoc,因此难点是结果的解析。完整代码如下:

可以看到,结果是一个JSON,其中文档放在一个_source属性中,因此解析就是拿到_source,反序列化为Java对象即可。

与之前类似,也是三步走:

1)准备Request对象。这次是查询,所以是GetRequest

2)发送请求,得到结果。因为是查询,这里调用client.get()方法

3)解析结果,就是对JSON做反序列化

3.2.2 完整代码

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

@Test
void testGetHotelDocumentById() throws IOException {
    //1.创建request对象,指定索引库和id
    GetRequest request = new GetRequest("hotel").id("36934");
    //2.发送请求
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    //3.解析结果
    String json = response.getSourceAsString();
    HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);

    //4.输出结果
    System.out.println(hotelDoc);
}

 运行之后,在控制台日志中可以看到输出的结果:

3.3 删除文档

删除的DSL为是这样的:

DELETE /hotel/_doc/{id}

与查询相比,仅仅是请求方式从DELETE变成GET,可以想象Java代码应该依然是三步走:

1)准备Request对象,因为是删除,这次是DeleteRequest对象。要指定索引库名和id

2)准备参数,无参

3)发送请求。因为是删除,所以是client.delete()方法

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

@Test
void testDeleteHotelDocument() throws IOException {
    //1.创建request对象,指定索引库和id
    DeleteRequest request = new DeleteRequest("hotel").id("36934");
    //2.准备请求参数
    //3.发送请求
    client.delete(request,RequestOptions.DEFAULT);
}

运行成功之后,在kibana界面可以发现已经成功删除了:

3.4 修改文档

3.4.1 语法说明

修改我们讲过两种方式:

  • 全量修改:本质是先根据id删除,再新增
  • 增量修改:修改文档中的指定字段值

在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:

  • 如果新增时,ID已经存在,则修改
  • 如果新增时,ID不存在,则新增

这里不再赘述,我们主要关注增量修改。

索引文档右边是es中存储的文档信息,左边是文档增量修改的语句,跟代码对比如下:

这里的文档更新比较特殊,是修改的参数名称和参数数据之间以逗号为区分,如果还有其他参数的话,在第一组数据后面加上逗号,继续添加。后台会自动识别,两个为一组。 

运行成功之后,在kibana界面可以看到,执行成功的文档:

与之前类似,也是三步走:

1)准备Request对象。这次是修改,所以是UpdateRequest

2)准备参数。也就是JSON文档,里面包含要修改的字段

3)更新文档。这里调用client.update()方法

3.4.2 完整代码

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

@Test
void testUpdateHotelDocument() throws IOException {
    //1.创建request对象,指定索引库和id
    UpdateRequest request = new UpdateRequest("csdn","1");
    //2.准备请求参数
    request.doc("email","123456789@qq.com");
    //3.发送请求
    client.update(request,RequestOptions.DEFAULT);
}

3.5 批量导入文档

案例需求:利用BulkRequest批量将数据库数据导入到索引库中。

步骤如下:

  • 利用mybatis-plus查询酒店数据
  • 将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)
  • 利用JavaRestClient中的BulkRequest批处理,实现批量新增文档
3.5.1 语法说明

批量处理BulkRequest,其本质就是将多个普通的CRUD请求组合在一起发送。

其中提供了一个add方法,用来添加其他请求:

可以看到,能添加的请求包括:

  • IndexRequest,也就是新增
  • UpdateRequest,也就是修改
  • DeleteRequest,也就是删除

因此Bulk中添加了多个IndexRequest,就是批量新增功能了。示例:

其实还是三步走:

1)创建Request对象。这里是BulkRequest

2)准备参数。批处理的参数,就是其它Request对象,这里就是多个IndexRequest

3)发起请求。这里是批处理,调用的方法为client.bulk()方法

 我们在导入酒店数据时,将上述代码改造成for循环处理即可。

3.5.2 完整代码

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

@Test
void testBulk() throws IOException {
    //1.批量查询酒店数据
    List<Hotel> hotels = hotelService.list();

    //2.创建Bulk请求
    BulkRequest request = new BulkRequest();

    //3.准备参数,添加多个新增的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));
    }
    //4.发起请求
    client.bulk(request,RequestOptions.DEFAULT);
}

运行成功之后,去kibana界面查询是否成功:

3.6 文档操作总结

文档操作的基本步骤:

  • 初始化RestHighLevelClient
  • 创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
  • 准备参数(Index、Update、Bulk时需要)
  • 发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
  • 解析结果(Get时需要)

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

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

相关文章

什么是逃逸分析

如何快速判断是否逃逸就看方法内new的对象实体是否能够被外部方法进行调用 什么是逃逸分析 在java虚拟机中&#xff0c;对象是在java堆中分配内存的&#xff0c;这是一个普遍的常识。但是&#xff0c;有一种特殊情况&#xff0c;那就是如果经过逃逸分析&#xff08;escape an…

nvidia系列教程-AGX-Orin can接口调试

目录 前言 一、AGX-Orin can介绍 二、原理图连接 三、系统配置 四、can数据收发 总结​​​​​​​ 前言 NVIDIA Jetson AGX Orin 是一款高性能的嵌入式平台,专为自动驾驶、机器人、物联网和其他需要大量计算能力和人工智能处理的应用设计。Jetson AGX Orin 集成了多个 …

【原创】java+swing+mysql客户信息管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

【xilinx】Versal Adaptive SoC DDRMC - NoC QoS 选项卡未出现

在 2024.1 之前的 Vivado 版本中&#xff0c;用户在使用 NoC 验证块设计时可以访问 NoC 对象窗口和 QoS 选项卡。 Vivado 2024.1 中存在一个已知问题&#xff0c;即 NoC 对象窗口和 QoS 选项卡不出现。 要显示 NoC 对象窗口和 QoS 选项卡&#xff0c;请保存块设计&#xff0c;…

【pwnable.kr】0x02-collision Writeup

题目描述 解法 拉取文件 scp -P2222 colpwnable.kr:col . scp -P2222 colpwnable.kr:col.c .分析源码 #include <stdio.h> #include <string.h>// hashcode值 unsigned long hashcode 0x21DD09EC;// 返回res&#xff0c;对main函数中传参进行“加密”变换操作 …

【特殊文件---properties】

properties 1. 注释 在properties中注释是采用#号开头的方式来进行注释的 2. 编写properties文件 在properties中&#xff0c;一行就是一个键值对&#xff08;keyvalue&#xff09;&#xff0c;简单的理解就是一行可以保存一个变量&#xff0c;键和值之间用号隔开 记住&…

使用Maple Flow进行工程计算与代码生成的图文教程

在工程和科学计算领域&#xff0c;Maple Flow以其强大的数学引擎和代码生成功能&#xff0c;成为工程师和研究人员的得力助手。本文将通过一系列步骤&#xff0c;引导您如何使用Maple Flow从概念验证到生成可在其他环境中运行的代码&#xff0c;完成一个完整的工作流程。 第一…

LLM大模型技术实战:一文讲透专补大模型短板的RAG

大型语言模型&#xff08;LLMs&#xff09;已经成为我们生活和工作的一部分&#xff0c;它们以惊人的多功能性和智能化改变了我们与信息的互动方式。但是当我们将大模型应用于实际业务场景时会发现&#xff0c;通用的基础大模型基本无法满足我们的实际业务需求&#xff0c;主要…

大模型时代,云南白药如何成为一家AI医药企业?|产业AI案例

作者|斗斗 编辑|皮爷 出品|产业家 中医药大模型发布&#xff1b;英伟达成立AI制药部门&#xff0c;发力生物制药领域&#xff1b;赛诺菲与百图生科达成战略合作&#xff0c;共同开发用于生物治疗药物发现的领先模型&#xff1b;京东发布医疗大模型&#xff1b;百度“产业级”…

机器学习--特征工程常用API

1. DictVectorizer - 字典特征提取 DictVectorizer 是一个用于将字典&#xff08;如Python中的字典对象&#xff09;转换为稀疏矩阵的工具&#xff0c;常用于处理类别型特征。 DictVectorizer(sparseTrue, sortTrue, dtype<class numpy.float64>)参数&#xff1a; spar…

ggplot阶截断坐标轴-gggap

目录 gggap包安装 功能查询 简单版使用代码 复杂版使用代码 gggap包安装 CRAN: Package gggap (-project.org) 手动下载安装 功能查询 > ?gggap > ?gggapDefine Segments in y-Axis for ggplot2 Description Easy-to-define segments in y-axis for ggplot2. …

使用Clion开发STM32串口调试遇到问题之重定向printf不显示(已解决问题)

为什么要使用重定向printf C语言中经常使用printf来输出调试信息&#xff0c;打印到屏幕。由于在单片机中没有屏幕&#xff0c;但是我们可以重定向printf&#xff0c;把数据打印到串口&#xff0c;从而在电脑端接收调试信息。这是除了debug外&#xff0c;另外一个非常有效的调…

根据前序遍历和中序遍历生成二叉树,并层序遍历输出二叉树

二叉树 前序遍历&#xff1a;ABDFCEGH 中序遍历&#xff1a;BFDAGEHC 演示 代码&#xff1a; package com.fdw.algorithm.hhh;import com.fdw.algorithm.structure.TreeNode;import java.util.LinkedList; import java.util.Queue;/*** description:* author: ThatMonth* cr…

Javaweb学习之JavaScript输出与字符串(二)

前情回顾 Javaweb学习之JavaScript&#xff08;一&#xff09;-CSDN博客 学习资源 w3school 在线教程 本期介绍 输出语句 在JavaScript中&#xff0c;有几种方式可以输出信息到控制台&#xff08;console&#xff09;、浏览器窗口&#xff08;window&#xff09;或其他地方。…

谷粒商城实战笔记-220~224-商城业务-微博认证服务-OAuth2.0

文章目录 一&#xff0c;220-商城业务-认证服务-OAuth2.0简介二&#xff0c;221-商城业务-认证服务-微博登录测试1&#xff0c;创建微博应用2&#xff0c;应用配置重定向url3&#xff0c;修改商城登录页面4&#xff0c;点击微博登录5&#xff0c;点击授权 三&#xff0c;222-商…

[译]开发者与熵的博弈

原文&#xff1a;https://itnext.io/entropy-in-software-development-77ed9110ef28 翻译&#xff1a;我的文章翻译智能体 文章润色智能体 文章转脑图智能体 人工校对 文章脉络&#xff1a; 文章概括&#xff1a; 文章通过热力学的视角&#xff0c;深入探讨了软件开发中的复…

GitHub的未来:在微软领导下保持独立与AI发展的平衡

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

企业高性能web服务器----nginx详细知识点+实验

知识点 一、Web 服务介绍 Apache Nginx 1、Apache 经典的 Web 服务端 Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是 1.X 和 2.X 其可以通过编译安装实现特定的功能 2、Apache的三种模型 Apache prefork 模型 预…

4000元亮度最高的投影仪:当贝X5S 3300CVIA流明超高亮度白天也清晰

你购买投影仪的时候一般预算多少&#xff1f;目前市面上的投影仪价位有几百也有上万&#xff0c;品牌和类型都比较多&#xff0c;买投影前比较关注哪些投影仪参数&#xff1f;最近有朋友向我咨询购买投影仪的事项&#xff0c;预算在4000左右&#xff0c;问问4000元哪款投影仪哪…

Ollama Desktop

一、简介 Ollama Desktop是基于Ollama引擎的一个桌面应用解决方案&#xff0c;用于在macOS、Windows和Linux操作系统上运行和管理Ollama模型的GUI工具。 Ollama Desktop提供了丰富的功能&#xff0c;包括但不限于&#xff1a; 可视化的管理界面&#xff1a;用户可以通过图形…