c`Blog - Java
type: channel
link: https://blog.oalo.cn/tag/Java/
items: Elasticsearch Linux 服务器安装使用指南
items: MapStruct使用说明
items: Java JSON 序列化库详解：Jackson、Gson、Fastjson
items: Spring boot 多数据源 + MyBatis + Druid 配置
items: Guava Preconditions工具类的详细介绍和使用指南
items: SpringMVC【入门篇】
items: Maven核心标签详解
items: ES-RestHighLevelClient查询文档
items: ES-DSL查询文档&搜索结果处理
items: ES-RestClient操作文档

Elasticsearch Linux 服务器安装使用指南
type: item
date: 2025-11-06T09:51:00+08:00
description: 目录1. 简介2. 环境要求3. 安装前准备4. 安装 Elasticsearch5. 配置 Elasticsearch6. 启动与管理服务7. 验证安装8. 基本使用9. 安全配置10. 性能优化11. 常见问题与解决方案12. 备份与恢复1. 简介Elasticsearch 是一个基于 Apache Lucene 的开源分布式搜索和分析引擎，适用于所有类型的数据，包括文本、数字、地理空间、结构化和非结构化数据。主要特性分布式架构：自动分片和副本管理RESTful API：通过 HTTP 进行交互近实时搜索：索引后几乎立即可搜索全文检索：强大的文本搜索和分析能力高可用性：支持集群和自动故障转移2. 环境要求2.1 硬件要求组件最低配置推荐配置CPU2核4核以上内存4GB16GB以上磁盘10GB100GB以上 SSD网络100Mbps1Gbps💡 资源受限环境说明如果您的服务器配置为 2核2G，Elasticsearch 仍然可以运行，但需要进行以下调整：JVM 堆内存：设置为 512MB-1GB（不超过物理内存的50%）索引分片数：减少分片数量，单节点环境建议设置为1索引副本数：设置为0（单节点无需副本）刷新间隔：增加到30s或更长，减少资源消耗数据量限制：建议数据量不超过10GB并发请求：限制并发查询数，避免OOM# 2核2G 环境推荐的 JVM 配置 -Xms512m -Xmx1g2.2 软件要求操作系统：CentOS 7/8、Ubuntu 18.04/20.04/22.04、RHEL 7/8Java：JDK 11 或更高版本（Elasticsearch 8.x 自带 OpenJDK）依赖包：glibc 2.17 或更高版本2.3 系统参数要求最大文件描述符：至少 65535最大线程数：至少 4096虚拟内存：至少 2621443. 安装前准备3.1 创建 Elasticsearch 用户# 创建 elasticsearch 用户组和用户 sudo groupadd elasticsearch sudo useradd -g elasticsearch -s /bin/bash -m elasticsearch # 设置密码（可选） sudo passwd elasticsearch3.2 配置系统参数3.2.1 修改文件描述符限制# 编辑 limits.conf sudo vim /etc/security/limits.conf # 添加以下内容 elasticsearch soft nofile 65535 elasticsearch hard nofile 65535 elasticsearch soft nproc 4096 elasticsearch hard nproc 40963.2.2 修改虚拟内存# 编辑 sysctl.conf sudo vim /etc/sysctl.conf # 添加以下内容 vm.max_map_count=262144 # 使配置生效 sudo sysctl -p3.2.3 禁用 Swap（推荐）# 临时禁用 sudo swapoff -a # 永久禁用，编辑 /etc/fstab，注释掉 swap 行 sudo vim /etc/fstab # 注释掉类似这样的行： # /dev/mapper/centos-swap swap swap defaults 0 03.3 安装 Java（如果需要）# CentOS/RHEL sudo yum install java-11-openjdk java-11-openjdk-devel -y # Ubuntu/Debian sudo apt update sudo apt install openjdk-11-jdk -y # 验证 Java 安装 java -version4. 安装 Elasticsearch4.1 方法一：使用 RPM 包安装（CentOS/RHEL）4.1.1 导入 GPG 密钥sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch4.1.2 创建 Yum 仓库选项 A：官方源（国外）sudo vim /etc/yum.repos.d/elasticsearch.repo添加以下内容：[elasticsearch] name=Elasticsearch repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-el…

MapStruct使用说明
type: item
date: 2025-10-04T18:43:19+08:00
description: MapStruct使用说明基于项目实践经验整理的MapStruct对象转换框架使用指南📚 目录一、MapStruct简介二、Maven依赖配置三、基本使用方法四、高级特性五、与Lombok协同使用六、最佳实践七、常见问题一、MapStruct简介1.1 什么是MapStructMapStruct是一个Java注解处理器，用于生成类型安全的Bean映射代码。它在编译时自动生成对象转换代码，避免了运行时反射带来的性能开销。1.2 核心优势特性说明零运行时反射编译期生成代码，运行时性能接近手写代码类型安全编译时检查字段映射，避免运行时错误易于调试生成的代码清晰可读，便于调试和审查简化维护集中管理映射规则，避免重复代码扩展性强支持自定义转换逻辑、表达式映射等高级特性1.3 适用场景Entity ↔ DTO 对象转换VO ↔ DTO 数据传输PO ↔ BO 业务对象映射多层架构中的对象转换二、Maven依赖配置2.1 添加版本属性在 pom.xml 的 <properties> 标签中添加版本号：<properties> <java.version>17</java.version> <mapstruct.version>1.5.5.Final</mapstruct.version> <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version> </properties>2.2 添加MapStruct依赖在 <dependencies> 标签中添加： <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version> </dependency>2.3 配置编译器插件在 <build><plugins> 中配置Maven编译插件（重要）：<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> 17 <target>17</target> <compilerArgs> <arg>-Amapstruct.defaultComponentModel=spring</arg> </compilerArgs> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>${lombok-mapstruct-binding.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin>注意事项：mapstruct-processor 是注解处理器，负责在编译时生成实现类lombok-mapstruct-binding 确保Lombok和MapStruct协同工作处理器顺序很重要：mapstruct-processor → lombok → lombok-mapstruct-binding三、基本使用方法3.1 创建Mapper接口建议创建专门的包存放Mapper接口，例如：cn.oalo.mapper.convertpackage cn.oalo.mapper.convert; import cn.oalo.dto.DataExportDto; import cn.oalo.entity.Data; import org.mapstruct.Mapper; import java.util.List; /** * Data实体与DTO转换Mapper */ @Mapper(co…

Java JSON 序列化库详解：Jackson、Gson、Fastjson
type: item
date: 2025-09-23T15:24:52+08:00
description: 1. 概述本文详细介绍 Java 生态中三种最流行的 JSON 处理库：Jackson、Gson 和 Fastjson。内容将涵盖它们的基本用法、高级特性、性能对比、优缺点分析以及最终的选型建议。目标读者是需要为项目选择 JSON 库或希望深入了解这些库区别的 Java 开发者。2. 库简介2.1 Jackson官网： https://github.com/FasterXML/jackson简介： Jackson 是 Java 生态中事实上的标准 JSON 处理库，功能极其丰富，性能优异。它是 Spring Framework 等众多主流框架的默认选择。Jackson 的核心是基于流的解析器（Streaming API），并在此基础上构建了数据绑定（Data Binding）功能，使开发者可以方便地与 POJO（Plain Old Java Object）进行转换。2.2 Gson官网： https://github.com/google/gson简介： 由 Google 开发，以其简单的 API 和易用性著称。Gson 的设计初衷是提供一种简单的方式将 Java 对象转换为 JSON 字符串（序列化），以及将 JSON 字符串转换为 Java 对象（反序列化）。它的上手难度很低，对于简单的场景非常友好。2.3 Fastjson官网： https://github.com/alibaba/fastjson简介： 由阿里巴巴开发，主打极致性能。在诸多性能基准测试中，Fastjson 的序列化/反序列化速度常常名列前茅。它提供了完整的 JSON 功能，并且 API 设计也较为直接。然而，其历史上出现过较多安全漏洞，这是选型时需要重点考虑的因素。3. 详细使用说明3.1 基本依赖引入（Maven） <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.40</version> </dependency>3.2 基本用法示例假设我们有一个简单的 Java 对象 User：public class User { private String name; private int age; private String email; // 无参构造器、Getter 和 Setter 方法必须存在 public User() {} public User(String name, int age, String email) { this.name = name; this.age = age; this.email = email; } // ... getters and setters }1. Jacksonimport com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); User user = new User("张三", 25, "zhangsan@example.com"); // 序列化：对象 -> JSON字符串 String jsonString = mapper.writeValueAsString(user); System.out.println(jsonString); // {"name":"张三","age":25,"email":"zhangsan@example.com"} // 反序列化：JSON字符串 -> 对象 String jsonInput = "{\"name\":\"李四\",\"age\":30,\"email\":\"lisi@example.com\"}"; User userObject = mapper.readValue(jsonInput, User.class); System.out.println(userObject.getName()); // 李四2. Gsonimport com.google.gson.…

Spring boot 多数据源 + MyBatis + Druid 配置
type: item
date: 2025-09-23T15:19:28+08:00
description: 概述本文档专门介绍在Spring Boot环境下如何配置和使用多数据源、MyBatis和Druid连接池的技术组合。本配置支持MySQL和达梦数据库的双数据源架构。核心技术版本Spring Boot: 3.1.4MyBatis: 3.0.1 (mybatis-spring-boot-starter)Druid: 1.2.18 (druid-spring-boot-starter)数据库驱动: MySQL 8.2.0 + 达梦数据库 8.1.2.141架构设计原理Application Layer ├── MySQL DataSource (Primary) │ ├── Druid Connection Pool │ ├── MyBatis SqlSessionFactory │ ├── Transaction Manager │ └── Mapper Interface (cn.oalo.mapper.mysql.*) └── DM DataSource (Secondary) ├── Druid Connection Pool ├── MyBatis SqlSessionFactory ├── Transaction Manager └── Mapper Interface (cn.oalo.mapper.dm.*)1. Maven依赖配置 (pom.xml)核心依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.18</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.2.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver18</artifactId> <version>8.1.2.141</version> </dependency> </dependencies>2. 核心配置详解2.1 Druid多数据源配置 (application.yml)spring: # 多数据源配置 datasource: # MySQL数据源配置 mysql: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test_mysql?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 username: root password: root type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: false test-on-return: false # 达梦数据库配置 dm: driver-class-name: dm.jdbc.driver.DmDriver url: jdbc:dm://localhost:5236 username: SYSDBA password: Dameng00 type: com.al…

Guava Preconditions工具类的详细介绍和使用指南
type: item
date: 2025-05-21T19:57:00+08:00
description: 以下是 Guava Preconditions 工具类的详细介绍和使用指南，它专注于参数和状态的快速校验，帮助开发者实现 快速失败（Fail-Fast），避免冗长的 if-else 逻辑。一、Guava Preconditions 简介所属库：Google Guava（核心工具库之一）用途：简化参数校验和状态检查，抛出标准异常（如 IllegalArgumentException）。核心思想：在方法入口处明确校验条件，增强代码可读性和健壮性。特点：轻量级，无复杂依赖。支持链式调用和自定义错误消息。适合非 Web 层（如工具类、Service 层）的校验。二、核心方法及使用示例1. 参数校验方法签名用途抛出异常checkArgument(boolean expression)校验方法参数合法性IllegalArgumentExceptioncheckArgument(boolean expression, String errorMsg)带自定义错误信息IllegalArgumentExceptioncheckArgument(boolean expression, String template, Object... args)格式化错误信息IllegalArgumentException示例：public void process(int value, String name) { Preconditions.checkArgument(value > 0, "值必须为正数，实际值: %s", value); Preconditions.checkArgument(name != null && !name.isEmpty(), "名称不能为空"); }2. 非空校验方法签名用途抛出异常checkNotNull(T reference)校验对象非 nullNullPointerExceptioncheckNotNull(T reference, String errorMsg)带自定义错误信息NullPointerException示例：public User createUser(String username, String email) { Preconditions.checkNotNull(username, "用户名不能为 null"); Preconditions.checkNotNull(email, "邮箱不能为 null"); // 业务逻辑... }3. 状态校验方法签名用途抛出异常checkState(boolean expression)校验对象或系统的状态IllegalStateExceptioncheckState(boolean expression, String errorMsg)带自定义错误信息IllegalStateException示例：public class ConnectionPool { private boolean initialized = false; public void connect() { Preconditions.checkState(!initialized, "连接池已初始化"); // 初始化逻辑... initialized = true; } }4. 索引和范围校验方法签名用途抛出异常checkElementIndex(int index, int size)校验索引在列表/数组的有效范围内（[0, size)）IndexOutOfBoundsExceptioncheckPositionIndex(int index, int size)校验位置在列表/数组的有效范围内（[0, size]）IndexOutOfBoundsExceptioncheckPositionIndexes(int start, int end, int size)校验区间 [start, end) 的有效性IndexOutOfBoundsException示例：public String getElement(List<String> list, int index) { Preconditions.checkElementIndex(index, list.size(), "索引越界"); return list.get(index); }三、集成 Guava Preconditions1. 添加依赖Maven：<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-jre</version> </dependency>Gradle：…

SpringMVC【入门篇】
type: item
date: 2025-05-18T20:29:00+08:00
description: 一、什么是SpringMVCSpringMVC（Spring Model-View-Controller）是Spring框架的一个模块，用于开发Web应用程序。它是一个基于请求驱动的框架，负责处理用户的请求，分发请求到合适的处理方法，并返回响应。SpringMVC遵循了经典的MVC设计模式，将Web应用分为三个部分：Model（模型）：主要是业务逻辑部分，用来保存数据或与数据库进行交互。View（视图）：用于显示数据，通常是JSP、Thymeleaf、FreeMarker等模板。Controller（控制器）：接受用户的请求，处理业务逻辑，调用模型层，返回数据，最终选择合适的视图进行展示。SpringMVC的主要作用是实现请求的分发与业务逻辑的处理，同时与Spring框架其他部分（如Spring的依赖注入、事务管理等）配合，提供完整的Web开发解决方案。二、SpringMVC执行原理流程要深入理解SpringMVC的执行原理，我们需要从请求的接收到响应的过程来分析。SpringMVC的工作流程大致可以分为以下几个步骤：客户端请求（浏览器发起请求）：用户在浏览器中输入URL或点击某个链接发起HTTP请求。前端控制器（DispatcherServlet）：所有的请求都会首先到达SpringMVC的核心组件——DispatcherServlet（前端控制器）。DispatcherServlet负责请求的分发和协调，它是整个SpringMVC的入口。请求映射（HandlerMapping）：DispatcherServlet会根据请求的URL，使用HandlerMapping来确定哪个控制器（Controller）的方法来处理这个请求。HandlerMapping会查找符合请求的映射关系，通常通过注解（如@RequestMapping）来定义。控制器适配器HandlerAdapter经过适配调用具体的处理器（Handler/Controller）控制器处理请求（Controller）：找到对应的Controller后，DispatcherServlet会调用该控制器的处理方法（比如@RequestMapping标注的方法）。控制器方法处理业务逻辑、数据查询等，并将结果返回给DispatcherServlet。视图解析（ViewResolver）：控制器方法的返回值一般是一个视图名称，SpringMVC会通过ViewResolver来解析出具体的视图（比如JSP文件、Thymeleaf模板等）。ViewResolver根据视图名称和配置的前后缀规则（如/WEB-INF/jsp/ + viewName + .jsp）找到对应的视图资源。返回响应（返回给客户端）：解析得到的视图会将数据渲染成HTML（或其他格式），然后响应给客户端（浏览器）。整个流程的关键是DispatcherServlet，它起到了“调度”和“分发”的作用，其他组件（如HandlerMapping、HandlerAdapter、ViewResolver等）各司其职，确保请求的高效处理。三、SpringMVC工作流程图（自上而下阅读）分阶段详细流程阶段 1：请求到达 DispatcherServlet入口类：DispatcherServlet#doDispatch()（核心调度方法）关键操作：protected void doDispatch(HttpServletRequest request, HttpServletResponse response) { // 1. 获取HandlerExecutionChain（包含拦截器链） HandlerExecutionChain mappedHandler = getHandler(request); // 2. 获取HandlerAdapter HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // 3. 执行拦截器preHandle if (!mappedHandler.applyPreHandle(request, response)) return; // 4. 实际调用Controller方法 ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler()); // 5. 处理视图渲染 applyDefaultViewName(request, mv); mappedHandler.applyPostHandle(request, response, mv); processDispatchResult(request, response, mapp…

Maven核心标签详解
type: item
date: 2025-05-10T23:44:00+08:00
description: 以下是关于 Maven核心标签 的详解，按功能模块分类，结合典型场景和最新趋势说明：一、项目元数据标签基础标识<groupId>com.company.project</groupId> <artifactId>core-service</artifactId> <version>2.5.0</version> <packaging>jar</packaging> 项目信息<name>核心服务模块</name> <description>负责业务逻辑处理</description> <url>https://project.company.com</url> <inceptionYear>2025</inceptionYear>二、依赖管理标签依赖声明<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>6.1.0</version> <scope>compile</scope> <optional>true</optional> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> </dependencies>最佳实践：使用<dependencyManagement>统一管理多模块版本（避免重复定义）。依赖范围（Scope）Scope适用阶段2025年适用场景provided编译/测试JDK 21+模块化项目中的Lombok、Jakarta EEtest仅测试单元测试框架（JUnit 6+、TestNG）以下是关于 Maven的<scope>标签 的详细解析[card title="<scope>标签的作用" color="info"]用于定义依赖项在项目生命周期中的生效范围，控制依赖的传递性、打包行为及环境适用性。 核心价值：优化构建效率，避免依赖冲突和冗余[/card]6种Scope详解Scope类型生效阶段是否传递依赖典型应用场景compile编译、测试、运行（默认值✅核心依赖（如Spring Core）provided编译、测试，但运行时不打包❌容器提供（如Servlet API、Lombok）runtime仅测试和运行，编译时不可见✅JDBC驱动（如MySQL Connector）test仅测试阶段（如JUnit）❌单元测试框架system同provided，但需显式指定本地路径❌非Maven仓库的自定义JARimport仅用于❌继承父POM的依赖管理（BOM文件）关键使用场景与示例provided的典型应用 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.32</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>runtime的依赖隔离 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <scope>runtime</scope> </dependency>import的依赖管理 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2025.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>常见问题与最新实践建议JDK 21+的模块化兼容性若使用syste…

ES-RestHighLevelClient查询文档
type: item
date: 2023-10-25T18:13:00+08:00
description: RestHighLevelClient操作查询文档查询操作基本步骤//注入依赖 @Autowired private RestHighLevelClient restHighLevelClient; //1.创建查询索引对象 SearchRequest request = new SearchRequest("索引库名"); //2.创建构生成器对象 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders qbs); //可以直接写成 => request.source().query(QueryBuilders qbs); //不创建对象 //3.传入生成器 request.source(sourceBuilder); //4.发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //5.解析响应数据 handleResponse(response);批量同步 //数据库同步索引库-批量操作 @Test void testBulkNewRequest() throws IOException { //分页打包添加 批量导入文档 int page = 1; int size = 100; Page<Hotel> hotelPage = hotelService.page(new Page<>(page, size)); for (long i = 1; i <= hotelPage.getPages(); i++) { Page<Hotel> hotelData = hotelService.page(new Page<>(i, size)); BulkRequest bulkRequest = new BulkRequest(); for (Hotel hotel : hotelData.getRecords()) { HotelDoc hotelDoc = new HotelDoc(hotel); String hotelString = JSONObject.toJSONString(hotelDoc); bulkRequest.add(new IndexRequest("hotel") .id(hotelDoc.getId().toString()) .source(hotelString, XContentType.JSON)); } client.bulk(bulkRequest, RequestOptions.DEFAULT); } }文档的增删改查操作class HotelDocumentTest { @Autowired private RestHighLevelClient client; @Autowired private IHotelService hotelService; /** * 文档的增删改查操作 * * @throws IOException io */ @Test void testAddDoc() throws IOException { //1.查询数据库hotel数据 Hotel hotel = hotelService.getById(61083); //2.转换为HotelDoc HotelDoc hotelDoc = new HotelDoc(hotel); //3.转换成json String jsonString = JSONObject.toJSONString(hotelDoc); //4.准备request IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString()); //5.这是发送的文档 request.source(jsonString, XContentType.JSON); client.index(request, RequestOptions.DEFAULT); } @Test void testGetDoc() throws IOException { //1.准备Request GetRequest request = new GetRequest("hotel").id("61083"); //2.发送请求 GetResponse response = client.get(request, RequestOptions.DEFAULT); //3.解析响应 String source = response.…

ES-DSL查询文档&搜索结果处理
type: item
date: 2023-10-25T12:19:00+08:00
description: DSL查询文档查询所有：查询出所有数据，一般测试用。例如：match_all全文检索（full text）查询：利用分词器对用户输入内容分词，然后去倒排索引库中匹配。例如：match_querymulti_match_query精确查询：根据精确词条值查找数据，一般是查找keyword、数值、日期、boolean等类型字段。例如：idsrangeterm地理（geo）查询：根据经纬度查询。例如：geo_distancegeo_bounding_box复合（compound）查询：复合查询可以将上述各种查询条件组合起来，合并查询条件。例如：boolfunction_score1.全文检索查询#match查询 //搜索字段越多，对查询性能影响越大，因此建议采用copy_to，然后单字段查询的方式比较好 GET /hotel/_search { "query": { "match": { "all":"上海外滩" } } } #multi_match查询 GET /hotel/_search { "query": { "multi_match": { "query": "如家", "fields": ["name","business"] } } }2.精准查询2.1term查询因为精确查询的字段搜是不分词的字段，因此查询的条件也必须是不分词的词条。查询时，用户输入的内容跟自动值完全匹配时才认为符合条件。如果用户输入的内容过多，反而搜索不到数据。//term 精准查询 GET /hotel/_search { "query": { "term": { "name": { "value": "上海" } } } }2.22.range查询范围查询，一般应用在对数值类型做范围过滤的时候。比如做价格范围过滤//range 范围查询 GET /hotel/_search { "query": { "range": { "price": { "gte": 100, "lte": 200 } } } }3.地理坐标查询所谓的地理坐标查询，其实就是根据经纬度查询官方文档：https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html常见的使用场景包括：携程：搜索我附近的酒店滴滴：搜索我附近的出租车微信：搜索我附近的人#geo_bounding_box矩形查询 GET /hotel/_search { "query": { "geo_bounding_box":{ "location":{ "top_left":{ "lat":31.1, "lon":121.5 }, "bottom_right":{ "lat":30.9, "lon":121.7 } } } } }#geo_distance 距离查询 GET /hotel/_search { "query": { "geo_distance":{ "distance":"100km", "location":"39.909187,116.397455" //天安门 } } }4.算分函数查询function score 查询中包含四部分内容：原始查询条件：query部分，基于这个条件搜索文档，并且基于BM25算法给文档打分，原始算分（query score)过滤条件：filter部分，符合该条件的文档才会重新算分算分函数：符合filter条件的文档要根据这个函数做运算，得到的函数算分（function score），有四种函数weight：函数结果是常量field_value_factor：以文档中的某个字段值作为函数结果random_score：以随机数作为函数结果script_score：自定义算分函数算法运算模式：算分函数的结果、原始查询的相关性算分，两者之间的运算方式，包括：multiply：相乘replace：用function score替换query score其它，例如：sum、avg、max、min#算分查询 GET /hotel/_search { "query": { "function_score": { "query": { "match": { "all": "外滩" } }, "functions": [ { "filter": { "term": { "brand": "如家" } }, "weight": 10 //加权重 } ], "boost_mode": "sum" } } }5.布尔查询布尔查询是一个或多个查询子句的组合，每一个子句就是一个子查询。子查询的组合方式有：must：必须匹配每个子查询，类似“与”should：选择性匹配子查询，类似“或”must_…

ES-RestClient操作文档
type: item
date: 2023-10-25T10:09:16+08:00
description: RestClient操作文档初始化RestClient在elasticsearch提供的API中，与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中，必须先完成这个对象的初始化，建立与elasticsearch的连接。分为三步：1）引入es的RestHighLevelClient依赖：<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2）因为SpringBoot默认的ES可能版本不一致，所以我们需要覆盖默认的ES版本：<properties> <java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>3）初始化RestHighLevelClient：初始化的代码如下：//可以使用配置类交给ioc @Configuration public class ESConfig { @Bean public RestHighLevelClient restHighLevelClient() { return new RestHighLevelClient( RestClient.builder( new HttpHost("00.0xx.x0x.xxx", 9200, "http") )); } } 索引库相关操作@SpringBootTest class HotelIndexTest { @Autowired private RestHighLevelClient client; //创建索引库 @Test void testCreateIndex() throws Exception { // 1.准备Request PUT /hotel CreateIndexRequest request = new CreateIndexRequest("hotel"); // 2.准备请求参数 request.source(MAPPING_TEMPLATE, XContentType.JSON); // 3.发送请求 client.indices().create(request, RequestOptions.DEFAULT); } //删除索引库 @Test void testDeleteIndex() throws IOException { // 1.准备Request DeleteIndexRequest request = new DeleteIndexRequest("hotel"); // 2.判断存不存在 GetIndexRequest indexRequest = new GetIndexRequest("hotel"); boolean exists = client.indices().exists(indexRequest, RequestOptions.DEFAULT); if (!exists) { System.out.println("不存在哦！"); return; } // 3.发送请求 client.indices().delete(request, RequestOptions.DEFAULT); } //判断是否存在 @Test void testGetIndex() throws IOException { GetIndexRequest request = new GetIndexRequest("hotel"); boolean exists = client.indices().exists(request, RequestOptions.DEFAULT); System.out.println(exists ? "存在" : "不存在"); } }Document文档操作@SpringBootTest class HotelDocumentTest { @Autowired private RestHighLevelClient client; @Autowired private IHotelService hotelService; @Test void testAddDoc() throws IOException { //1.查询数据库hotel数据 Hotel hotel = hotelService.getById(61083); //2.转换为HotelDoc HotelDoc h…