第一步,开启本地的 ElasticSearch

启动 elasticSearch.bat

npm run start (head 插件)

第二步,在 Spring Boot 项目中引入依赖

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

第三步,配置 yml 和 配置类

# ES
elasticsearch:host: 127.0.0.1port: 9200username:  # 若 ES 无账号密码,可不填password:  # 若 ES 无账号密码,可不填connectTimeout: 5000   # 连接超时(毫秒)socketTimeout: 30000   # 读写超时(毫秒)maxConnTotal: 100      # 最大连接数maxConnPerRoute: 10    # 单路由最大连接数
package com.wf.config;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ElasticsearchConfig {@Value("${elasticsearch.host}")private String host;@Value("${elasticsearch.port}")private int port;@Value("${elasticsearch.username}")private String username;@Value("${elasticsearch.password}")private String password;@Value("${elasticsearch.connectTimeout}")private int connectTimeout;@Value("${elasticsearch.socketTimeout}")private int socketTimeout;@Value("${elasticsearch.maxConnTotal}")private int maxConnTotal;@Value("${elasticsearch.maxConnPerRoute}")private int maxConnPerRoute;@Beanpublic RestHighLevelClient restHighLevelClient() {// 构建 RestClientRestClientBuilder builder = RestClient.builder(new HttpHost(host, port, "http")).setRequestConfigCallback(requestConfigBuilder -> {requestConfigBuilder.setConnectTimeout(connectTimeout);requestConfigBuilder.setSocketTimeout(socketTimeout);return requestConfigBuilder;}).setHttpClientConfigCallback(httpClientBuilder -> {httpClientBuilder.setMaxConnTotal(maxConnTotal);httpClientBuilder.setMaxConnPerRoute(maxConnPerRoute);return httpClientBuilder;});return new RestHighLevelClient(builder);}
}

 第四步,实现实体类

package com.wf.dao.ESPojo;import lombok.Data;@Data
public class ESArticle {private String id;          // ES 文档 IDprivate String title;       // 标题(测试 IK 分词)private String content;     // 内容(测试 IK 分词)private Long createTime;    // 在 ES 中的时间private String summary;//概述private Integer viewCounts;//浏览次数private String author;//作者
}

第五步,实现 Service

package com.wf.service;import com.alibaba.fastjson.JSON;
import com.wf.dao.ESPojo.ESArticle;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@Service
public class ArticleEsService {@Resourceprivate RestHighLevelClient restHighLevelClient;private static final String INDEX_NAME = "article_index"; // 索引名//ik 分词器public List<ESArticle> searchByKeyword(String keyword) throws IOException {SearchRequest request = new SearchRequest(INDEX_NAME);SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 构建 match 查询:默认对 "title" 和 "content" 分词搜索(可指定字段)MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("title", keyword).analyzer("ik_max_word"); // 明确指定分词器(或依赖 mapping 配置)sourceBuilder.query(matchQuery);request.source(sourceBuilder);SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 解析结果List<ESArticle> result = new ArrayList<>();for (SearchHit hit : response.getHits().getHits()) {result.add(JSON.parseObject(hit.getSourceAsString(), ESArticle.class));}return result;}// 创建索引(含 IK 分词配置)public boolean createIndex() throws IOException {CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME);// 配置 mapping(指定 IK 分词)XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("properties")// title 字段:索引用 ik_max_word,搜索用 ik_smart.startObject("title").field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer", "ik_smart").endObject()// content 字段:同上.startObject("content").field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer", "ik_smart").endObject()// summary 概述字段.startObject("content").field("type", "text").field("analyzer", "ik_max_word").field("search_analyzer", "ik_smart").endObject()// author.startObject("author").field("type","text").field("analyzer","ik_max_word").field("search_analyzer","ik_smart").endObject()// createTime 字段.startObject("createTime").field("type", "long").endObject().endObject().endObject();request.mapping(String.valueOf(mapping));// 执行创建CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);return response.isAcknowledged();}// 判断索引是否存在public boolean existsIndex() throws IOException {IndicesExistsRequest request = new IndicesExistsRequest(INDEX_NAME);
//        return restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);return true;}// 删除索引public boolean deleteIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest(INDEX_NAME);return restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT).isAcknowledged();}// 新增文档public String addDocument(ESArticle article) throws IOException {IndexRequest request = new IndexRequest(INDEX_NAME).id(article.getId()) // 自定义 ID,若不填则 ES 自动生成.source(JSON.toJSONString(article), XContentType.JSON);IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);return response.getId(); // 返回 ES 生成的 ID(若自定义则和入参一致)}// 修改文档(根据 ID 更新)public boolean updateDocument(ESArticle article) throws IOException {UpdateRequest request = new UpdateRequest(INDEX_NAME, article.getId()).doc(JSON.toJSONString(article), XContentType.JSON);UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);return response.getResult() != null;}// 删除文档(根据 ID 删除)public boolean deleteDocument(String docId) throws IOException {DeleteRequest request = new DeleteRequest(INDEX_NAME, docId);DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);return response.getResult() != null;}// 查询文档(根据 ID 查询)public ESArticle getDocument(String docId) throws IOException {GetRequest request = new GetRequest(INDEX_NAME, docId);GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);if (response.isExists()) {return JSON.parseObject(response.getSourceAsString(), ESArticle.class);}return null;}
}

第六步,测试

    @Resourceprivate ArticleEsService articleEsService;// 测试创建索引@Testvoid testCreateIndex() throws IOException {boolean success = articleEsService.createIndex();System.out.println("创建索引结果:" + success); // 期望 true}// 测试新增文档@Testvoid testAddDocument() throws IOException {ESArticle article = new ESArticle();article.setId("1");article.setTitle("Spring Boot 集成 Elasticsearch 7.6.1");article.setContent("详细讲解如何在 Spring Boot 中使用 Elasticsearch,包含 IK 分词验证...");article.setCreateTime(System.currentTimeMillis());String docId = articleEsService.addDocument(article);System.out.println("新增文档 ID:" + docId); // 期望 "1"}// 测试分词查询(验证 IK)@Testvoid testSearchByKeyword() throws IOException {List<ESArticle> articles = articleEsService.searchByKeyword("Spring Boot");System.out.println("查询结果:" + articles.size()); // 期望 1articles.forEach(System.out::println);}

使用 head 查看创建情况

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

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

相关文章

软件开发的“中庸之道”:因势而为,心中有数

【软件工程】软件开发的“中庸之道”&#xff1a;因势而为&#xff0c;心中有数 在软件开发的方法论讨论中&#xff0c;我们常常陷入非此即彼的二元对立&#xff1a;要么追求极致的规范化和流程化&#xff0c;严格遵循软件工程的各项标准&#xff1b;要么完全摒弃方法论&#x…

Go和Elixir极简HTTP服务对比

Go 和 Elixir 都是我非常喜欢的编程语言&#xff0c;这次来对比下它们实现一个原生极简 HTTP 服务的过程。 Go 语言标准库自带了网络服务库&#xff0c;只需要简单几行代码就可以实现一个网络服务&#xff0c;这也是一开始它吸引我的一个方面。而 Elixir 标准库本身没有网络服…

为何要学习Objective-C?从环境搭建开始

目录 前言 Swift时代为何还要学Objective-C&#xff1f; 开发环境搭建 1. 安装Xcode 2. 创建第一个Command Line Tool项目 初识Objective-C代码 编写"Hello, Objective-C!" 编译运行程序 为什么Objective-C中的NSLog和NSString前面都有"NS"前缀&a…

ubuntu18.04安装 gcc 9以及2019版本tbb

一、安装gcc 9 ubuntu18.04默认是用的gcc7.5 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt-get install gcc-9 g-9 下面是配置优先用哪个版本的gcc和g &#xff0c;后面带的值越大越优先用谁&#xff0c;并且配置完全局生效不仅仅是在当…

JdbcUtils的三个版本以及sql注入问题

JDBC的工具类 1.0版本 JDBC的工具类 2.0版本&#xff08;智能一些&#xff09;&#xff0c;编写properties属性文件&#xff0c;程序就可以读取属性文件 JDBC的工具类 3.0版本&#xff0c;加入连接池对象 我们封装jdbc工具类是为了减少代码重复&#xff0c;方便开发&#xff0…

AS32系列MCU芯片I2C模块性能解析与调试

国科安芯推出的AS32X601内置的I2C模块提供了符合工业标准的两线串行制接口&#xff0c;可用于MCU和外部IIC设备的通讯。IIC总线使用两条串行线&#xff1a;串行数据线SDA和串行时钟线SCL。 IIC接口模块实现了IIC协议的标准模式和快速模式&#xff0c;支持多主机IIC总线架构。其…

钉钉小程序开发实战:打造一个简约风格的登录页面

在上一篇文章中&#xff0c;我们已经介绍了如何搭建钉钉小程序的基础环境&#xff0c;并完成了项目的初始化配置。本文将继续深入&#xff0c;手把手带你实现一个简约风格的登录页面&#xff0c;这是大多数企业级应用不可或缺的一部分。 钉钉小程序基于前端 Web 技术栈&#x…

论文研读2-1:多GNSS双历元纯相位定位-模型建立与误差分析

后续文章: 论文研读2-2&#xff1a;多GNSS双历元纯相位定位-固定模糊度精度增益 论文研读2-3&#xff1a;多GNSS双历元纯相位定位-定位精度分析 仅相位定位中的模糊度解算问题 在卫星导航定位中&#xff0c;载波相位测量是实现高精度定位的基础&#xff0c;但如果仅使用相位测…

Python----OpenCV(图像増强——图像平滑、均值滤波、高斯滤波、中值滤波、双边滤波)

Python----计算机视觉处理&#xff08;Opencv&#xff1a;图像噪点消除&#xff1a;滤波算法&#xff0c;噪点消除&#xff09; 一、图像平滑 图像平滑处理&#xff08;Smoothing Images&#xff09;&#xff0c;也称为图像模糊处理、图像滤波&#xff08;Images Filtering&am…

笔记:使用EasyExcel导入csv文件出现编码问题,导致导入数据全为null的解决方法

笔记&#xff1a;使用EasyExcel导入csv文件出现编码问题&#xff0c;导致导入数据全为null的解决方法 通常情况下&#xff0c;我们使用excel导入&#xff0c;但是部分情况下或者领导要求&#xff0c;我们需要使用csv导入文件&#xff0c;但是csv文件模板下载之后会变成系统当前…

NL2SQL(Natural Language to SQL)优化之道:提升准确率与复杂查询能力

自然语言 → SQL 的转译&#xff08;NL2SQL&#xff09;技术&#xff0c;是让非技术用户与数据库“对话”的桥梁。而在实际应用中&#xff0c;我们不仅需要“能转”&#xff0c;更要“转得准、转得全、转得快”。 一、什么是 NL2SQL&#xff1f; NL2SQL&#xff08;Natural La…

java中map的循环方式

什么是Map集合&#xff1f; Map是Java中的一个接口&#xff0c;它用于存储键-值对&#xff0c;并且键和值都可以是任意对象。它是Java集合框架中的一部分&#xff0c;并提供了一些方法来操作和访问Map中的元素。 Map中的每个键都是唯一的&#xff0c;这意味着不能使用相同的键…

python学习笔记(深度学习)

文章目录 1、概述2、学习内容2.1、pytorch 常见语法2.1.1、sum2.1.2、广播机制2.1.3、张量2.1.4、DataLoader 2.2、普通语法2.2.1、迭代器 1、概述 本篇博客用来记录&#xff0c;在深度学习过程中&#xff0c;常用的 python 语法内容 2、学习内容 2.1、pytorch 常见语法 2.…

力扣网C语言编程题:搜索二维矩阵(右上角->左下角解法)

一. 简介 上一篇文章关于"在二维数组中查找某个元素"的问题&#xff0c;提供了两种解题思路&#xff0c;文章如下&#xff1a; 力扣网C语言编程题&#xff1a;搜索二维矩阵的普通解法与二分查找法-CSDN博客 本文提供第三种解题思路&#xff1a;从左下角->右上角…

AI大模型流式输出,OkHttp Log拦截打印方案

背景&#xff1a; 使用okhttp框架进行网络访问时&#xff0c;一般会使用 HttpLoggingInterceptor 打印请求和响应的log。在使用okhttp访问AI大模型时&#xff0c;如果选择流式输出&#xff0c;那么响应的body数据使用的SSE技术&#xff0c;服务异步发送大模型生成的增量token&…

看数据世界的历史:全面梳理从关系库、大数据到AI时代的数据发展及展望

序章 在数据库不断发展的时代里&#xff0c;我们看到了关系型数据库&#xff08;RDB&#xff09;在一次次的数据演变过程中的占据王位&#xff0c;捍卫了胜利&#xff0c;像一个王朝更替下的“王权”的故事&#xff0c;精彩有趣。 本篇就来探讨下数据库的发展兴衰史&#xff0…

元宇宙与人工智能的融合:从虚拟世界到智能生态的IT新革命

文章目录 引言&#xff1a;前沿技术重塑数字交互体验一、元宇宙与AI融合的本质&#xff1a;虚拟空间与智能交互的交汇元宇宙赋能AI&#xff1a;AI赋能元宇宙&#xff1a; 二、元宇宙与AI融合的演进&#xff1a;从概念到产业热潮三、核心技术&#xff1a;元宇宙与AI融合的基石与…

问卷调查[mqtt dht]

任务 this code uses esp32-wroom-32 and dht11 to read the humidty and temperature, besieds, it will send the meassage to the cloud platform. All communication is conducted through MQTT. 打分标准 您应该对以下代码进行评级&#xff0c;并且必须遵守如…

swift 对象转Json

在 Swift 中将对象转换为 JSON 可以通过以下方法实现&#xff1a; 使用 Codable 协议 Swift 的 Codable 协议&#xff08;Encodable 和 Decodable 的组合&#xff09;是处理 JSON 编码和解码的推荐方式。 struct Person: Codable {var name: Stringvar age: Int }let person…

Python学习Day43

学习来源&#xff1a;浙大疏锦行 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt from PIL import Image import os # 设置随机…