【springboot-04】ElasticSearch8.7搜索

news2024/11/25 22:50:33

为什么学?因为它查询速度很快,而且是非关系型数据库 (NoSql)

一些增删改查已经配置好了,无需重复敲码

ElasticSearch 更新快,本篇文章将主要介绍一些常用方法。

对于 spirngboot 整合 Es 的文章很少,有些已经过时【更新太快了】

 依赖:Maven

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

配置类:EsConfig

@Configuration
public class EsConfig {

    // 创建低级客户端
    public RestClient restClient() {
        return RestClient.builder(
                // 创建一个客户端 地址本机 9200 端口
                new HttpHost("localhost",9200)
        ).build();
    }

    // 使用Jackson映射器创建传输层
    public ElasticsearchTransport elasticsearchTransport() {
        return new RestClientTransport(
                // 将客户端放在这里
                restClient(),
                // json 解析器 【spring boot提供】
                new JacksonJsonpMapper());
    }

    // 创建API客户端
    @Bean
    public ElasticsearchClient elasticsearchClient() {
        return new ElasticsearchClient(elasticsearchTransport());
    }
}

水果信息

@Document(indexName = "fruit")
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Fruit implements Serializable {
    private Long id;
    @Field(type = FieldType.Text)
    private String name;
    @Field(type = FieldType.Keyword)
    private String category;
    @Field(type = FieldType.Double)
    private Double price;
    @Field(index = false, type = FieldType.Keyword)
    private String images;
    private String body;
}

操作数据库:继承类

// 继承 Ela... 可以简单实现增删改查
// 存储位置: Elasticsearch 安装目录下有个data 文件夹
// 集群操作: 可以多复制几个 ES 服务器【集群名字不能相同,端口不能相同】
@Repository
public interface FruitRepository extends ElasticsearchRepository<Fruit,Long>{
    Fruit findById(long id);
    Fruit findByName(String name);
    // 通过分类查询所有水果
    // category 水果分类
    List<Fruit> findAllByCategory(String category);
}

配置已完成!


1. 增删改查

调用 save 方法,该方法已经在 CrudRepository 实现

long id = System.currentTimeMillis();
Fruit fruit = new Fruit(id,"红蛇果","苹果",7.29,"https://s1.ax1x.com/2023/02/13/pSIqh2q.png","蛇果");
fruitMapper.save(fruit);
System.out.println(fruit.getId());

控制器 Controller 里面如何添加?fruitServices 写在 service 层,这个 Controller 层只做请求和响应,具体业务逻辑与上面添加代码一样(即 save 方法)。

@PostMapping("/add")
    public ResponseBody<String> addFruit(Fruit fruit) {
        // 调用 service 层方法
        HttpStatus status = fruitService.save(fruit);
        // 针对操作成功与否,返回不同的响应
        if (status == HttpStatus.OK) {
            // 操作成功
            return ResponseBody.success();
        }
        return ResponseBody.failure(status);
}

普通的增删改查,其实与数据库操作并无区别【步骤都差不多】

  1. 创建一个接口类 【继承 ElasticsearchRepository】 (MySql 可能会用到 @Mapper 注解或者映射文件,这里采取 Mybatis 来管理 MySql)
  2. 可以直接写 Controller 层【如果可以,也可以写在 Service 层】
  3. 运行、浏览器请求接口【完毕!】

2. 搜索?——用 ES 方式查询数据库

对于实际例子,我们可以看这篇2019年的文章【SpringBoot 整合 ElasticSearch】

对于查询来说,相比于普通增删改查,多了一个 @Query 注解,对于老版本的一些方法已经废弃了,如 NativeSearchQueryBuilder 已被弃用

@Query 注解?elasticsearch 常见几种查询方式

  1. 精准查询 term【完全匹配,不分词】
    1. 单值查询
    2. 多值查询
  2. 匹配查询 match 【分词,类似模糊匹配】
    1.  match
    2.  match_all
    3. multi_match
    4. match_phrase 【分词,保留全部搜索词项,位置相同】
  3. bool 查询【类似于 mysql where语句】
    1. must 【and 匹配】
    2. must_not 【不算贡献分】
    3. should 【or 匹配】
    4. filter 【过滤,不算贡献分】
  4. filter 查询 【缓存,常和range范围搭配使用】
    1. gt 大于
    2. lt 小于
    3. gte 大于等于
    4. lte 小于等于

 当没有采用 @Query 时,默认精准查询

如查询 http://localhost:8123/fruit/红富士苹果 

List<Fruit> findAllByName(String name);

 如果在接口方法上加上 @Query,同样查询红富士苹果

调用接口与上面类似,只是作为区分,方法名以 Match 结尾【可自定义方法名】

🐱‍🚀 同样如果不用重新创建一个方法,直接在接口方法添加 @Query 就行

@Query("{\"match\":{\"name\":\"?0\"}}")
List<Fruit> findAllByNameMatch(String name);

😊总结:自定义查询的方式有2种

  1. 自定义1个接口,并对其进行实现 【官方基本够使用,因此很少自己创建】
  2. 使用 @Query 来修饰接口方法 【个人感觉用的较多】

3. 爬虫?这只是方便获取大量网上信息

    @Autowired
    private BlobRepository blobRepository;

    @Test
    public void testE1() throws InterruptedException {
        for (int i = 0;i < 31;i++) {
            String content = "";

            // 创建httpclient实例
            try(CloseableHttpClient httpclient = HttpClients.createDefault()) {
                // 创建http get实例
                HttpGet httpget = new HttpGet("https://www.quge9.cc/book/666/" + i + ".html");
                // 执行get请求
                CloseableHttpResponse response = httpclient.execute(httpget);
                // 返回实体
                HttpEntity entity = response.getEntity();
                // 转码: UTF-8
                content = EntityUtils.toString(entity, "utf-8");
                // 关闭流和释放系统资源
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 解析网页
            Document document = Jsoup.parse(content);
            // 选出文章段落
            Elements articleP = document.selectXpath("//*[@id=\"chaptercontent\"]");
            // 处理文章段落,将每一段拆开,添加上<p></p>
            String[] text = articleP.text().split(" ");
            List<String> pList = new ArrayList<>(Arrays.asList(text));
            StringBuilder resultP = new StringBuilder();
            for (String p : pList) {
                // 过滤掉无关信息
                if (!p.contains("请收藏本站") && !p.contains("点此报错")) {
                    p = p.replaceAll((char)12288 + "","");
                    p = "<p>" + p + "</p>";
                    resultP.append(p);
                }
            }

            // 解析标题
            Elements articleT = document.select("#read > div.book.reader > div.content > h1");

            // 获取结果,保存数据库
            Blob blob = new Blob(System.currentTimeMillis(),articleT.text(),"史上最强练气期",new Date(),resultP.toString());
            blobRepository.save(blob);
            System.out.println("正在爬取第" + i + "章内容...,每隔3秒爬取下一章内容!");
            Thread.sleep(3*1000);
        }
    }

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

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

相关文章

看了这一篇文章,你还不懂MySQL体系结构,你来找我

前言 工作很长时间了&#xff0c;对于数据库的掌握程度却仅仅停留在表面的CRUD阶段&#xff0c;对于深层次的原理和技术知识了解的少之又少&#xff0c;随着岁数不断的增长。很多时候&#xff0c;出去找工作很迷茫&#xff0c;被面试官问的感觉自己很菜。现在利用工作休息时间&…

微信小程序第五节——登录那些事儿(超详细的前后端完整流程)

&#x1f4cc; 微信小程序第一节 ——自定义顶部、底部导航栏以及获取胶囊体位置信息。 &#x1f4cc; 微信小程序第二节 —— 自定义组件 &#x1f4cc; 微信小程序第三节 —— 页面跳转的那些事儿 &#x1f4cc; 微信小程序第四节—— 网络请求那些事儿 &#x1f61c;作 …

人工智能时代背景下,如何发展与应用自动化测试?

人工智能时代为自动化测试提供了机会和挑战。在发展自动化测试方面&#xff0c;是人工智能领域下的一个应用方向&#xff0c;和无人驾驶、机器人等一样&#xff0c;都是AI技术的应用场景。从技术的发展角度看&#xff0c;自动化测试一共经历了四代发展变化。从最早提出自动化测…

关于 变量

关于局部变量和静态变量&#xff08;基于有一定指针基础&#xff09; #include<stdio.h> void aaa() {int n10;} int main() {printf("%d",n);return 0; } 在这个代码里&#xff0c;很明显会报错&#xff0c;未定义该n标识符&#xff0c;因为这个n是局部变量…

在程序里面执行system(“cd /某个目录“),为什么路径切换不成功?

粉丝提问&#xff1a; 彭老师&#xff0c;问下&#xff0c;在程序里面执行system(“cd /某个目录”)&#xff0c;这样会切换不成功&#xff0c;为啥呢 实例代码&#xff1a; 粉丝的疑惑是明明第10行执行了cd /media操作&#xff0c; 为什么12行执行的pwd > test2.txt 结…

Unity InputField滑动条

InputField增加滑动条效果 类似图中效果 添加一个InputField组件 2 .添加一个Scrollbar放在InputField内 调整属性 调整InputFiled组件属性 需要将Scrollbal添加到InputField的scrollbar上 然后根据美术需求将位置进行调整&#xff0c;记得InputFiled下的Text不要被Scr…

【浓缩概率】浓缩概率思想帮我蒙选择题的概率大大提升!

今天在学习的时候遇到一个很有趣的思想叫作浓缩概率&#xff0c;可以帮我们快速解决一下概率悖论问题&#xff01; 什么是概率 计算概率有下面两个最简单的原则&#xff1a; 原则一、计算概率一定要有一个参照系&#xff0c;称作「样本空间」&#xff0c;即随机事件可能出现…

Docker容器--Consul部署

Docker容器--Consul部署 一、简介1、概述2、Consul两种模式 二、Consul特性1、特性2、应用场景 三、部署Consul集群&#xff08;Server端&#xff09;1、建立Consul服务2、设置代理&#xff0c;在后台启动consul服务端3、查看集群信息 四、Consul部署&#xff08;Client端&…

第4章:运算符

1.算术运算符 ① SELECT 10010,100-35.5,100*2,100/2,100%30 FROM DUAL;②在sql中“”没有连接作用&#xff0c;表示加法运算&#xff0c;字符串转换为数值&#xff08;隐式转换&#xff09;。非数值看作0处理 SELECT 1001 1 FROM DUAL;SELECT 100 a FROM DUAL;③加法运算…

Trie Tree(字典树)例题

字典树. 又称单词查找树&#xff0c; Trie树 &#xff0c;是一种 树形结构 &#xff0c;是一种哈希树的变种。经常被搜索引擎系统用于文本词频统计。. 它的优点是&#xff1a;利用字符串的公共前缀来减少查询时间&#xff0c;最大限度地减少无谓的字符串比较&#xff0c;查询效…

Python 使用chatGPT帮忙写一个有序集类 OrderedSet

需求:需要实现一个有序的集合&#xff0c;像python普通集合一样&#xff0c;除了 它是有序的 我这边穿插着使用了gpt3.5和gpt4,发现确实还是gpt4好用&#xff0c;一分钱一分货啊 问&#xff1a;我的要求是这样&#xff0c;data是一个集合&#xff0c;往里面放了2&#xff0c;…

【大厂面试问题】:飞机绕行地球问题

你的阅读是我最大的动力 目录 你的阅读是我最大的动力 问题描述&#xff1a; 引出思路&#xff1a; 一台加油飞机 两台加油飞机 返航方案一&#xff1a;加油机I、II同时起飞。 返航方案二&#xff1a;加油机I先起飞加油机II再起飞 答案 不直接说答案&#xff0c;一步一…

14个WooCommerce商城网站必备插件

开始建立 WooCommerce 网站&#xff1f;您需要一个具有许多有助于吸引和留住客户的有用功能的网站。虽然基本的 WooCommerce 设置非常方便&#xff0c;但您可以通过使用有用的插件扩展 WooCommerce 来做更多的事情。 有数百个插件需要考虑&#xff0c;我们已经完成了研究&…

[C++初阶]栈和队列_优先级队列的模拟实现 deque类 的理解

为了更好的理解优先级队列priority_queue&#xff0c;这里会同时进行栈和队列的提及 文章目录 简要概念&#xff08;栈和队列&#xff09;栈和队列的模拟实现与使用stack&#xff08;栈&#xff09;deque的理解和操作queue priority_queue&#xff08;优先级队列&#xff09;框…

悲观锁、乐观锁、自旋锁和读写锁

悲观锁和乐观锁 悲观锁&#xff1a;在每次取数据时&#xff0c;总是担心数据会被其他线程修改&#xff0c;所以会在取数据前先加锁&#xff08;读锁&#xff0c;写锁&#xff0c;行 锁等&#xff09;&#xff0c;当其他线程想要访问数据时&#xff0c;被阻塞挂起。&#xff08…

金融贷款行业如何高效获客,积累意向客户群体——运营商大数据

现如今贷款行业面对的运营压力日益扩大&#xff0c;顾客贮备是生存的关键&#xff0c;传统式的陌生拜访&#xff0c;一切随缘销售市场已不能满足其要求。互联网消费行为的融合与转变是在销售市场端反映&#xff0c;直接影响着广告推广广告策略的确立与运用。 可是&#xff0c;…

移除元素【数组】

⭐前言⭐ ※※※大家好&#xff01;我是同学〖森〗&#xff0c;一名计算机爱好者&#xff0c;今天让我们进入练习模式。若有错误&#xff0c;请多多指教。更多有趣的代码请移步Gitee &#x1f44d; 点赞 ⭐ 收藏 &#x1f4dd;留言 都是我创作的最大的动力&#xff01; 题目 27…

IPEmotion 2023 R1支持在线能量分析

新发布的IPEmotion 2023 R1提供了许多新功能&#xff0c;其中最重要的是新的“在线功率计算&#xff08;Online Power Calculation&#xff09;”功能。该功能允许使用预定义的功率计算来进行测量任务和数据分析。此外&#xff0c;IPEmotion 2023 R1现在支持一种新的存储模式&a…

Maya英文界面怎么改为中文界面

Maya是一款3D动画和视觉效果软件&#xff0c;用于创建逼真的角色和大片般的效果&#xff0c;也是受到电影、电视和游戏行业的 3D 建模师、动画师、照明艺术家和 VFX 艺术家等多数人喜爱的一款3D软件。我们在使用Maya的过程中&#xff0c;常常会遇到一些小阻碍&#xff0c;比如M…

【Python爬虫实战】你不必到处找数据,你完全可以自己爬之Python批量采集图虫网摄影师高清美照,听说~你喜欢御姐...(爬图神器)

前言 怎么批量保存网页图片&#xff1f; 有时候在网页中看到很多美图其中有很多自己喜欢的图片素材或壁纸&#xff0c;一张纸一张下载保存未 免太低效了。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众ha…