ElasticSearch学习笔记二:使用Java客户端

news2024/12/21 3:32:09

一、前言

在上一篇文章中,我们对ES有了最基本的认识,本着实用为主的原则,我们先不学很深的东西,今天打算先学习一下ES的Java客户端如何使用。

二、创建项目

1、普通Maven项目

1、创建一个Maven项目

2、Pom文件

<dependencies>

  <!--ES客户端-->
  <dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>7.17.25</version>
  </dependency>

  <!--JSON序列化-->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.0</version>
  </dependency>

  <!--lombok:用于生成GET/SET 简化开发-->
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
  </dependency>

</dependencies>

3、Coding

(1)创建ES客户端

 /**
     * 获取ES客户端
     * @return es Java客户端
     */
    private static ElasticsearchClient getEsClient() {
        //Rest客户端,可以理解为是一个Http客户端,用于发送http请求
        RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
        //ElasticsearchTransport用于和ES集群通信,封装了各种方法,第二个参数则是设置序列化方式
        ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }

(2)判断索引Product是否存在,如果不存在则创建索引。(当然通常情况下创建索引的操作是手动操作的,就类似创建数据表)

 /**
     * 校验并创建索引,如果存在直接返回true
     * 如果不存在则创建索引,同时返回是否创建成功的结果
     */
    private static boolean checkAndCreateIndex(final ElasticsearchIndicesClient indices) throws IOException {
        //构建索引是否存在的请求参数
        ExistsRequest existsRequest = new ExistsRequest.Builder().index("product").build();
        final BooleanResponse exists = indices.exists(existsRequest);
        if (exists.value()) {
            System.out.println("索引已经存在,不用再创建了");
            return true;
        }
        //Java17的新特性(这样写字符串真的很方便)
        Reader createIndexJson = new StringReader("""
            {
              "mappings": {
                "properties": {
                  "id":{
                    "type": "long"
                  },
                  "name":{
                    "type": "text",
                    "analyzer":"ik_max_word"
                  },
                  "price":{
                    "type": "double"
                  }
                }
              }
            }""");
        //创建索引
        CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index("product") //索引名
            .includeTypeName(false) //是否包含包名
            .settings(new IndexSettings.Builder().numberOfShards("1").numberOfReplicas("1").build())
            .withJson(createIndexJson).build();
        final CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);
        System.out.println("创建索引是否成功:" + createIndexResponse.acknowledged());
        return createIndexResponse.acknowledged();
    }

(3)批量写入数据

    /**
     * 批量写入数据
     */
    private static boolean bulkWriteDoc(final ElasticsearchClient esClient) throws IOException {
        final List<Product> products = generalProduct(100);

        //批量写入
        BulkRequest.Builder br = new BulkRequest.Builder();
        for (Product product : products) {
            br.operations(op -> op.index(idx -> idx.index("product").id(product.getId().toString()).document(product)));
        }
        BulkResponse bulkResponse = esClient.bulk(br.build());
        System.out.println("批量写入结果是否成功:" + !bulkResponse.errors());
        return !bulkResponse.errors();
    }


//product的代码

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {

    private Long id;

    private String name;

    private Double price;
}

(4)查询数据

//根据ID查询
GetResponse<Product> response = esClient.get(g -> g.index("product").id("1"), Product.class);
if (response.found()) {
    System.out.println("根据ID查询到对应的数据 " + response.source());
} else {
    System.out.println("根据ID查询未对应的数据");
}

//根据条件查询:例如搜索名称为商品20的数据
SearchResponse<Product> queryResponse = esClient.search(
    s -> s.index("product").query(q -> q.match(t -> t.field("name").query("商品20"))), Product.class);
TotalHits total = queryResponse.hits().total();
assert total != null;
boolean isExactResult = total.relation() == TotalHitsRelation.Eq;

if (isExactResult) {
    System.out.println("命中的文档数量为:" + total.value());
} else {
    System.out.println("没有命中任务数据");
}

List<Hit<Product>> hits = queryResponse.hits().hits();
for (Hit<Product> hit : hits) {
    Product product = hit.source();
    System.out.println("命中的数据:" + product);
}

(5)完整代码

package com.cmxy.esdemo;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.BulkRequest;
import co.elastic.clients.elasticsearch.core.BulkResponse;
import co.elastic.clients.elasticsearch.core.GetResponse;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation;
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient;
import co.elastic.clients.elasticsearch.indices.ExistsRequest;
import co.elastic.clients.elasticsearch.indices.IndexSettings;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.endpoints.BooleanResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import com.cmxy.entity.Product;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;

public class ESTest {

    public static void main(String[] args) throws IOException, InterruptedException {
        try (ElasticsearchClient esClient = getEsClient()) {
            //获取es客户端
            //判断索引是否存在
            final ElasticsearchIndicesClient indices = esClient.indices();
            //判断索引是否存在,如果不存在则创建
            boolean createIndexSuccess = checkAndCreateIndex(indices);

            //往索引里写入数据
            boolean writeSuccess = false;
            if (createIndexSuccess) {
                writeSuccess = bulkWriteDoc(esClient);
            }

            //写入成功后,查询
            if (writeSuccess) {
                queryData(esClient);
            }
        }

    }

    private static void queryData(final ElasticsearchClient esClient) throws InterruptedException, IOException {
        //阻塞一下,否则刚写入直接查询会查不到数据
        Thread.sleep(2000L);
        //根据ID查询
        GetResponse<Product> response = esClient.get(g -> g.index("product").id("1"), Product.class);
        if (response.found()) {
            System.out.println("根据ID查询到对应的数据 " + response.source());
        } else {
            System.out.println("根据ID查询未对应的数据");
        }

        //根据条件查询:例如搜索名称为商品20的数据
        SearchResponse<Product> queryResponse = esClient.search(
            s -> s.index("product").query(q -> q.match(t -> t.field("name").query("商品20"))), Product.class);
        TotalHits total = queryResponse.hits().total();
        assert total != null;
        boolean isExactResult = total.relation() == TotalHitsRelation.Eq;

        if (isExactResult) {
            System.out.println("命中的文档数量为:" + total.value());
        } else {
            System.out.println("没有命中任务数据");
        }

        List<Hit<Product>> hits = queryResponse.hits().hits();
        for (Hit<Product> hit : hits) {
            Product product = hit.source();
            System.out.println("命中的数据:" + product);
        }
    }

    /**
     * 批量写入数据
     */
    private static boolean bulkWriteDoc(final ElasticsearchClient esClient) throws IOException {
        final List<Product> products = generalProduct(100);

        //批量写入
        BulkRequest.Builder br = new BulkRequest.Builder();
        for (Product product : products) {
            br.operations(op -> op.index(idx -> idx.index("product").id(product.getId().toString()).document(product)));
        }
        BulkResponse bulkResponse = esClient.bulk(br.build());
        System.out.println("批量写入结果是否成功:" + !bulkResponse.errors());
        return !bulkResponse.errors();
    }

    /**
     * 校验并创建索引,如果存在直接返回true
     * 如果不存在则创建索引,同时返回是否创建成功的结果
     */
    private static boolean checkAndCreateIndex(final ElasticsearchIndicesClient indices) throws IOException {
        //构建索引是否存在的请求参数
        ExistsRequest existsRequest = new ExistsRequest.Builder().index("product").build();
        final BooleanResponse exists = indices.exists(existsRequest);
        if (exists.value()) {
            System.out.println("索引已经存在,不用再创建了");
            return true;
        }
        //Java17的新特性(这样写字符串真的很方便)
        Reader createIndexJson = new StringReader("""
            {
              "mappings": {
                "properties": {
                  "id":{
                    "type": "long"
                  },
                  "name":{
                    "type": "text",
                    "analyzer":"ik_max_word"
                  },
                  "price":{
                    "type": "double"
                  }
                }
              }
            }""");
        //创建索引
        CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index("product") //索引名
            .includeTypeName(false) //是否包含包名
            .settings(new IndexSettings.Builder().numberOfShards("1").numberOfReplicas("1").build())
            .withJson(createIndexJson).build();
        final CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);
        System.out.println("创建索引是否成功:" + createIndexResponse.acknowledged());
        return createIndexResponse.acknowledged();
    }

    private static List<Product> generalProduct(int count) {
        List<Product> products = new ArrayList<>();
        for (int i = 1; i <= count; i++) {
            products.add(new Product((long) i, "商品" + i,
                BigDecimal.valueOf(Math.random() * 1000).setScale(2, RoundingMode.HALF_UP).doubleValue()));
        }
        return products;
    }

    /**
     * 获取ES客户端
     *
     * @return es Java客户端
     */
    private static ElasticsearchClient getEsClient() {
        //Rest客户端,可以理解为是一个Http客户端,用于发送http请求
        RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
        //ElasticsearchTransport用于和ES集群通信,封装了各种方法,第二个参数则是设置序列化方式
        ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }
}

(6)运行结果

这里可能有的朋友会有点疑惑包括笔者一开始也是,为什么我搜索的是“商品20”,能命中的文档数居然是100,按理说不应该只有一条吗?还有为什么命中了100条只返回了10条呢?

其实是这样的,因为我们当前的product索引,他的name是一个text类型,是会被分词的,我们可以看下他分词后是涨什么样子的

在kibana中执行如下命令

POST /product/_analyze
{
  "field": "name",
  "text": "商品20"
}

结果:
{
  "tokens" : [
    {
      "token" : "商品",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "20",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "ARABIC",
      "position" : 1
    }
  ]
}

我们可以看到对于name的分词,分为“商品”和“20”两个词,且match时默认是用or,换成我们熟悉的Mysql,那就是类似于 select * from product where namelike ‘%商品%’ or name like ‘%20%’,所以所有的的数据就查到了。

例如我插入了一个产品,名称为测试20,我再执行查询语句:

GET /product/_search
{
  "size": 200, 

  "sort": [
    {
      "id": {
        "order": "desc"
      }
    }
  ], 
 "query": {
   "match": {
     "name": {
       "query": "商品20",
       "analyzer": "ik_max_word"
     }
   }
 }
}

结果如下图

2、Springboot整合ESClient
2.1、使用ES原生客户端

(1)Pom文件

<?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>
  <groupId>com.cmxy</groupId>
  <artifactId>springboot-es</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springboot-es</name>
  <description>springboot-es</description>
  <properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.6.13</spring-boot.version>
    <jakarta.json>2.0.1</jakarta.json>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.elasticsearch</groupId>
      <artifactId>elasticsearch</artifactId>
      <version>7.17.25</version>
    </dependency>
    <dependency>
      <groupId>co.elastic.clients</groupId>
      <artifactId>elasticsearch-java</artifactId>
      <version>7.17.25</version>
    </dependency>
    <!-- 覆盖springboot维护的版本 -->
    <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-client</artifactId>
      <version>7.17.25</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.3</version>
    </dependency>
    <dependency>
      <groupId>jakarta.json</groupId>
      <artifactId>jakarta.json-api</artifactId>
      <version>2.0.1</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>

  </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.cmxy.springbootes.SpringbootEsApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

(2)将EsClient注入Spring容器

@Component
public class EsConfig {

    @Bean
    public ElasticsearchClient esClient() {
        // Create the low-level client
        RestClient restClient = RestClient.builder(
            new HttpHost("localhost", 9200)).build();
        // Create the transport with a Jackson mapper
        ElasticsearchTransport transport = new RestClientTransport(
            restClient, new JacksonJsonpMapper());

        // And create the API client
        return new ElasticsearchClient(transport);
    }
}

(3)在要用的地方引入

@RestController
@RequestMapping("/es")
public class EsController {

    @Resource
    private ElasticsearchClient elasticsearchClient;

    @GetMapping("/testEs")
    public boolean testEs() throws IOException {
        ExistsRequest request = new ExistsRequest.Builder()
        .index("product")
        .build();
        BooleanResponse exists = elasticsearchClient.indices().exists(request);
        return exists.value();
    }

2.2、使用springData

(1)添加依赖

<?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>
    <groupId>com.cmxy</groupId>
    <artifactId>springboot-es</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-es</name>
    <description>springboot-es</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jakarta.json>2.0.1</jakarta.json>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>



    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

</dependencies>
<dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>${spring-boot.version}</version>
        <configuration>
            <mainClass>com.cmxy.springbootes.SpringbootEsApplication</mainClass>
            <skip>true</skip>
        </configuration>
        <executions>
            <execution>
                <id>repackage</id>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>
</build>

</project>

(2)添加配置文件

spring:
  elasticsearch:
    uris: localhost:9200

(3)编写Repository

package com.cmxy.springbootes.demos.repository;

import com.cmxy.springbootes.demos.entity.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProductEsRepository extends ElasticsearchRepository<Product,Long> {
}

(4)Controller

package com.cmxy.springbootes.demos.service;

import com.cmxy.springbootes.demos.entity.Product;
import com.cmxy.springbootes.demos.repository.ProductEsRepository;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.SearchOperations;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/es")
public class EsController {

    @Resource
    private ElasticsearchOperations elasticsearchOperations;
    @Resource
    private SearchOperations searchOperations;

    @Resource
    private ProductEsRepository productEsRepository;

    /**
     * 校验索引是否存在
     *
     * @return
     */
    @GetMapping("/checkIndex")
    public boolean checkIndexExists() {
        return elasticsearchOperations.indexOps(Product.class).exists();
    }

    /**
     * 创建索引
     */
    @PostMapping("/createIndex")
    public boolean createIndex() {
        return elasticsearchOperations.indexOps(Product.class).create();
    }

    /**
     * 批量写入文档
     */
    @PostMapping("/batchCreateDocument")
    public boolean batchCreateDocument() {
        List<Product> products = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            products.add(new Product((long) i, "商品" + i, BigDecimal.valueOf(Math.random() * 1000).setScale(2, RoundingMode.HALF_UP).doubleValue()));
        }
        productEsRepository.saveAll(products);
        return true;
    }

    /**
     * 根据ID查询
     *
     * @param id
     * @return
     */
    @GetMapping("/getById")
    public Product getById(Long id) {
        //当然也可以这几使用searchOperations操作,类似 repository和mapper的关系
        Product product = productEsRepository.findById(id).orElse(null);
        System.out.println(product);
        return product;
    }


    @GetMapping("/query")
    public List<Product> query() {
        Criteria criteria = new Criteria("name").is("商品20");
        Query query = new CriteriaQuery(criteria);
        SearchHits<Product> searchHits = searchOperations.search(query, Product.class);
        if (searchHits.hasSearchHits()) {
            List<SearchHit<Product>> hits = searchHits.getSearchHits();
            return hits.stream().map(SearchHit::getContent).collect(Collectors.toList());
        }
        return null;
    }

}

三、结束语

至此我们已经使用原生ES客户端、整合Springboot、使用SpringData操作了ES,当然目前只是简单的操作,更多的API我们还是要参考官方文档。后面计划学习ES的数据类型,希望对你有所帮助。

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

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

相关文章

[Linux]多线程详解

多线程 1.线程的概念和理解1.1线程的优点1.2线程的缺点1.3线程的设计1.4线程 VS 进程 2.线程控制2.1线程等待2.2 线程终止2.3 线程分离 3.线程互斥3.1背景3.2抢票代码演示3.3保护公共资源&#xff08;加锁&#xff09;3.3.1创建锁/销毁锁3.3.2申请锁/尝试申请锁/解锁 3.4解决抢…

替换OpenTSDB和HBase,宝武集团使用IoTDB助力钢铁设备智能运维

时序数据库 IoTDB 应用于宝武集团全基地钢铁时序数据管理&#xff0c;激活数据资产&#xff0c;赋能大型设备智能运维。 1. 背景概述 宝武装备智能科技有限公司&#xff08;以下简称&#xff1a;宝武智维&#xff09;是中国宝武设备智能运维专业化平台公司&#xff0c;30 余年始…

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(1)开发环境搭建

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;1&#xff09;开发环境搭建 1.开发环境搭建&#xff08;安装ESP-IDF&#xff09;2.开发环境搭建&#xff08;安装VS Code&#xff09;3.开发环境搭建&#xff08;VSCode中安装ESP-IDF插件及配置&#xff09; 1.开发环境搭建&am…

Ubuntu24 上安装搜狗输入法

link 首先在终端中依次输入以下代码 sudo apt update sudo apt install fcitx 找到语言支持 在终端中依次输入 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ sudo apt purge ibus 进入网页 搜狗输入法linux-首页​ shurufa.sogou.com/linux 找到刚才下…

Qt文件目录操作

文件目录操作相关类 Qt 为文件和目录操作提供了一些类&#xff0c;利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个&#xff1a; QCoreApplication&#xff1a;用于提取应用程序路径&#xff0c;程序名等文件信息&#xff1b;QFile&#x…

Session注入

Session注入 在进行Dll注入的时候&#xff0c;我们发现没法注入一些系统进程 提示我们缺少权限或者拒绝访问&#xff0c;甚至干脆就是什么反应都没有 这时候我们考虑往更加底层去跟函数&#xff0c;我们不能再使用在用户层所给我们的函数&#xff0c;我们自己去寻找内核层的…

深入List集合:ArrayList与LinkedList的底层逻辑与区别

目录 一、前言 二、基本概念 三、相同之处 四、不同之处 五、ArrayList 底层 六、LinkedList 底层 七、ArrayList 应用场景 八、LinkedList 应用场景 九、ArrayList和LinkedList高级话题 十、总结 一、前言 在Java集合的广阔舞台上&#xff0c;ArrayList与LinkedLis…

从建立TRUST到实现FAIR:可持续海洋经济的数据管理

1. 引言 随着我们对信息管理方式的信任&#xff0c;我们的社会对数字化数据的以来呈指数级增长。为了跟上大数据的需求&#xff0c;通过不断的努力和持续实践&#xff0c;对“good”数据管理方式的共识也在不断发展和演变。 加拿大正在建设国家基础设施和服务以及研究数据管理…

数据结构《栈和队列》

文章目录 一、什么是栈&#xff1f;1.1 栈的模拟实现1.2 关于栈的例题 二、什么是队列&#xff1f;2.2 队列的模拟实现2.2 关于队列的例题 总结 提示&#xff1a;关于栈和队列的实现其实很简单&#xff0c;基本上是对之前的顺序表和链表的一种应用&#xff0c;代码部分也不难。…

一.Spring cloud--Consul服务注册与发现(2)

安装并运行Consul (1)官网下载 (2)下载完成后只有一个consul.exe文件,对应全路径下查看版本号信息 (3)使用开发模式启动 consul agent -dev 通过以下地址可以访问Consul的首页: http://localhost:8500 结果页面

【搜索结构】AVL树的学习与实现

目录 什么是AVL树 AVL树的定义 插入函数的实现 左单旋和右单旋 左右双旋与右左双旋 什么是AVL树 AVL树实际上就是二叉搜索树的一种变体&#xff0c;我们都知道二i叉搜索树可以将查找的时间复杂度提升到O(logn)&#xff0c;极大提升搜索效率。但是在极端情况下&#xff0c;当…

IPTV智慧云桌面,后台服务器搭建笔记

环境CentOs7.9 &#xff0c;安装宝塔yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 访问宝塔&#xff0c;修改服务器端口安全组端口 26029 注意&#xff01;&#xff01;&#xff01;&#xff01…

IDEA leetcode插件代码模板配置,登录闪退解决

前言 最近换电脑&#xff0c;配置idea时和原来的模板格式不一样有点难受&#xff0c;记录一下自己用的模板&#xff0c;后期换电脑使用&#xff0c;大家也可以使用&#xff0c;有更好的地方可以分享给我~ IDEA leetcode插件代码模板配置,登录闪退解决 前言1 下载IDEA leetcode…

Django基础用法+Demo演示

Django快速上手 参考: Django快速上手 再写几个页面 编辑demo1/urls.py, 添加URL和视图函数映射 urlpatterns [path(index/, views.index),path(user/list/, views.user_list),path(user/add/, views.user_add), ]编辑app01/views.py&#xff0c;添加几个函数 from djang…

蓝桥杯-洛谷刷题-day3(C++)

目录 1.忽略回车的字符串输入 i.getline() ii.逐个字符的识别再输入 2.获取绝对值abs() 3.做题时的误区 4.多个变量的某一个到达判断条件 i.max() 5.[NOIP2016 提高组] 玩具谜题 i.代码 6.逻辑上的圆圈 i.有限个数n的数组 7.数组的定义 i.动态数组 1.忽略回车的字符串输…

Redis在高性能缓存中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 引言 Redis 概述 定义与原理 发展历程 Redi…

AOP实现上下游泳道隔离RPC调用

在平时代码项目代码测试的过程中&#xff0c;“隔离”思想就经常被用上&#xff0c;比方说多个并行开发的需求都需要用到服务 A 的能力&#xff0c;但是又需要同时部署 A 不同的代码分支&#xff0c;这个时候“泳道隔离”机制就显得尤为重要了。“泳道隔离”即将相同代码仓库的…

TCP/IP--Socket套接字--JAVA

一、概念 Socket套接字&#xff0c;是由系统提供⽤于⽹络通信的技术&#xff0c;是基于TCP/IP协议的⽹络通信的基本操作单元。 基于Socket套接字的⽹络程序开发就是⽹络编程。 二、分类 1.流套接字 使用传输层TCP协议。TCP协议特点&#xff1a;有链接、可靠传输、面向字节流…

号卡分销系统,号卡系统,物联网卡系统源码安装教程

号卡分销系统&#xff0c;号卡系统&#xff0c;物联网卡系统&#xff0c;&#xff0c;实现的高性能(PHP协程、PHP微服务)、高灵活性、前后端分离(后台)&#xff0c;PHP 持久化框架&#xff0c;助力管理系统敏捷开发&#xff0c;长期持续更新中。 主要特性 基于Auth验证的权限…

平衡二叉搜索树之 红黑 树的模拟实现【C++】

文章目录 红黑树的简单介绍定义红黑树的特性红黑树的应用 全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量和红黑树节点的定义 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert【重要】第一步&#xff1a;按照二叉搜索树的方式插入新节点第二步&#x…