solr快速上手:整合spring-data-solr实现客户端操作(十)

news2024/12/27 18:29:35

0. 引言

前一章介绍了官方的solr客户端SolrJ,但是solrJ的使用相对来说并不方便,仍然需要做一些负责的客户端操作以及语句的书写,有没有更加方便的ORM框架呢,这就提到了spring-data-solr

1. 简介

首先如果你还不知道spring-data相关工具包如何查看官方文档的,这里给大家统一说明一下

1、spring-data的所有文档都可以在这个路径下看到https://docs.spring.io/spring-data/

2、找到solr,点击进去

在这里插入图片描述
3、选择docs,即文档,然后选择当前版本current,如果你要直接查看指定版本的也可根据版本号访问

在这里插入图片描述
4、进入后选择reference,再选择html,即可进入官方说明文档

spring-data-solr官方文档

在这里插入图片描述

一定要善用官方文档,这可以帮助我们少走很多弯路。本文也简单介绍spring-data-solr的基本操作,更多的使用,还要大家结合官方文档来去拓展

spring-data-solr的使用步骤实际上在github源码中有说明,但下面我们还是详细待大家搭建一遍

2. 使用

1、引入spring-data-solr依赖,spring-data-solrsolr之间的版本号对应关系如下

spring-data-solrsolr
4.0.x7.4.0
4.1.x8.2.0
4.2.x8.5.1
4.3.x8.5.2

如果你solr使用的是7.4之前的版本,可以通过查看spring-data-solr文件查看对应关系

在这里插入图片描述
我这里因为使用的是solr8.2.0,所以引入依赖

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-solr</artifactId>
            <version>4.1.13.RELEASE</version>
        </dependency>

2、添加配置文件application.properties

spring.data.solr.host=http://192.168.244.41:8983/solr

3、创建实体类Orders

这里使用的是之前演示的实体,要绑定spring-data-solr的话,需要在实体类上加上@SolrDocument注解,并用collection说明核心名。

同时@Id表示主键字段,@Indexed表示索引字段,name、type属性与managed-schema中配置的保持一致

@Data
@SolrDocument(collection = "orders")
public class Orders {

    @Field("id")
    @Id
    @Indexed(name = "id", type = "long")
    private Long id;

    @Field("order_no")
    @Indexed(name = "order_no", type = "string")
    private String orderNo;

    @Field("address")
    @Indexed(name = "address", type = "text_general")
    private String address;

    @Field("product_name")
    @Indexed(name = "product_name", type = "string")
    private String productName;

    @Field("remarks")
    @Indexed(name = "remarks", type = "string")
    private String remarks;

    @Field("status")
    @Indexed(name = "status", type = "int")
    private Integer status;

    @Field("create_user")
    @Indexed(name = "create_user", type = "string")
    private String createUser;

    @Field("create_time")
    @Indexed(name = "create_time", type = "date")
    private Date createTime;

    @Field("labels")
    @Indexed(name = "labels", type = "string")
    private List<String> labels;

}

4、创建Repository类,用于声明对应核心的增删改查方法,如果用过spring-data-es的同学会感觉到有些熟悉,实际上两者的用法也相似

public interface OrdersRepository extends CrudRepository<Orders, Long> {
}

CrudRepository自带了很多常用的增删改查接口
在这里插入图片描述
如果要实现分页查询等可以采用集成SolrCrudRepository,该类继承自PagingAndSortingRepository,该类中提供了分页接口
在这里插入图片描述

同时spring-data-solr,本身支持自拓语法,在官方文档中也有说明,可以通过连接符(AND,OR)以及字段名来快速实现接口方法

在这里插入图片描述
总体支持的关键字我在spring-data-solr中没有找到说明,但是在spring-data-elasticsearch中有提到,大家可以参考

(注:如下所有语法仅在spring-data-es中验证过,未验证spring-data-solr,仅供参考,这里吐槽下solr的使用率因为不没有es高,spring-data官方给出的文档也相差甚远,很多es中有详细说明的,在solr中没有,大家可以交叉参考,很多内容都是通用的)
在这里插入图片描述

我们这里书写两个,同时把继承类改成SolrCrudRepository

@Repository
public interface OrdersRepository extends SolrCrudRepository<Orders, Long> {

    List<Orders> findByAddressOrProductName(String address, String productName);

    List<Orders> findByProductName(String productName);
}

5、启动类中添加注解@EnableSolrRepositories(basePackages = "com.example.solrdemo.dao"),用于开启扫描Repository类,其中basePackages是Repository类包路径

6、书写controller层,书写测试接口

@RestController
@RequestMapping("orders/data")
public class OrdersDataController {

    @Autowired
    private OrdersRepository ordersRepository;

    @GetMapping("save2")
    public void save2(Long id){
        Orders orders = new Orders();
        orders.setId(id);
        orders.setOrderNo("20230601000"+id);
        orders.setAddress("贵州省遵义市");
        orders.setProductName("小米手机");
        orders.setRemarks("送货上门");
        orders.setCreateUser("root");
        orders.setCreateTime(new Date());
        orders.setStatus(1);
        ordersRepository.save(orders);
    }

    @GetMapping("searchByName")
    public List<Orders> searchByName(String productName){
        return ordersRepository.findByProductName(productName);
    }

    @GetMapping("searchByAddressAndName")
    public List<Orders> search2(String address, String name){
        return ordersRepository.findByAddressOrProductName(address, name);
    }

}

7、调用新增接口:http://localhost:8092/orders/data/save?id=10

8、solr-admin中查询发现数据新增成功

在这里插入图片描述

9、同时测试下查询接口

在这里插入图片描述

在这里插入图片描述

3. 复杂查询

上述Repository接口实际上只能满足我们简单接口的实现,实际生产中可能还有更复杂的语法场景,这时就可以利用自带的SolrTemplate来实现

1、首先创建配置类,初始化SolrTemplate

@Configuration
public class SolrConfig {

    @Value("${spring.data.solr.host}")
    private String host;

    @Bean
    public SolrClient solrClient(){
        return new HttpSolrClient.Builder(host).build();
    }

    @Bean
    public SolrTemplate solrTemplate(){
        return new SolrTemplate(solrClient());
    }
}

2、solrTemplate提供查询,最简单的只需要Query.query构造查询语句即可

 @GetMapping("save2")
    public void save2(Long id){
        Orders orders = new Orders();
        orders.setId(id);
        orders.setOrderNo("20230601000"+id);
        orders.setAddress("贵州省遵义市");
        orders.setProductName("小米手机");
        orders.setRemarks("送货上门");
        orders.setCreateUser("root");
        orders.setCreateTime(new Date());
        orders.setStatus(1);
        solrTemplate.saveBean("orders", orders);
        solrTemplate.commit("orders");
    }

    @GetMapping("search3")
    public Page<Orders> search3(String address, String name){

        Query query = Query.query("address:"+address+" AND product_name:"+name);

        Page<Orders> orders = solrTemplate.query("orders", query, Orders.class);
        return orders;
    }

但有时我们希望对象化的构造方式,可以看到Query.query方法参数也支持Criteria对象,所以也可以通过构造查询

在这里插入图片描述

3、更多用法可在官方文档查看:
https://docs.spring.io/spring-data/data-solr/docs/current/reference/html/#solr.misc.partialUpdates

在这里插入图片描述

总结

本文未将比较详尽的SolrTemplate语法列举,更多的是提供一个学习的入口,本文的目的不在于精进研究高级语法,还在于带大家掌握基础、引领入门,更多更深的用法,还要靠大家自己结合官方文档去尝试

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

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

相关文章

面试题:深拷贝和浅拷贝(+内存图)

深拷贝和浅拷贝主要是针对对象的属性是对象&#xff08;引用类型&#xff09; 一、基本类型和引用类型的区别 1&#xff09;、基本类型&#xff1a;就是值类型&#xff0c;即在变量所对应的内存区域存储的是值。 2&#xff09;、引用类型&#xff1a;就是地址类型。 何为地…

Kubeadm 部署k8s实现并且演示滚动不停服务更新

1. 环境准备 在开始之前&#xff0c;部署Kubernetes集群机器需要满足以下几个条件&#xff1a; 一台或多台机器&#xff0c;操作系统 CentOS7.x-86_x64&#xff1b;硬件配置&#xff1a;2GB或更多RAM&#xff0c;2个CPU或更多CPU&#xff0c;硬盘30GB或更多&#xff1b;集群中…

【Activiti】原理

一、核心类 RepositoryService&#xff1a;部署管理流程资源&#xff0c;如bpmn文件、附件等等&#xff1b;RuntimeService&#xff1a;操作运行时的流程&#xff1b;TaskService&#xff1a;流程中任务的信息&#xff1b;HistoryService&#xff1a;流程的历史信息&#xff1…

ZYNQ——按键和LED关联实验

ZYNQ 7020黑金开发板的PL端有四个LED&#xff0c;如下图所示。 PL端也有四个KEY&#xff0c;如下图所示。 本文将把这四个按键和四个LED一一对应起来&#xff0c;在按键按下或松开时&#xff0c;对应的LED产生亮或灭的信号。 在原理图中找到PL端的LED和KEY如下图所示。 通过…

成为python爬虫工程师需要哪些知识?

爬虫&#xff08;Web crawler&#xff09;是一种自动化程序&#xff0c;用于从互联网上抓取、解析和提取网页数据。它模拟浏览器行为&#xff0c;通过发送HTTP请求获取网页内容&#xff0c;并通过解析网页源代码或DOM结构&#xff0c;提取所需的信息。以python爬虫为例&#xf…

优思学院|作业标准和标准化作业有何区别?傻傻搞不清?

作业标准和标准作业是两个在生产和制造环境中具有重要意义的概念。尽管它们看似相似&#xff0c;但实际上它们在定义、目的和实施方法上存在显著差异。本文将探讨作业标准和标准作业的区别&#xff0c;以及它们在工作场所中的作用和重要性。 1. 引言 在制造领域中&#xff0c…

JDBC小记——SQL注入及预编译操作对象、批处理

目录 SQL注入 预编译操作对象 自定义JDBC工具类 1.创建配置文件 2.配置 3.在工具类中使用配置文件 批处理 注意事项 SQL注入 SQL注入是黑客对数据库进行攻击的常用手段之一&#xff0c;他们拼接一些恶意的sql语句&#xff0c;来获取他们想要的数据。 例&#xff1a; s…

Bpmn.js流程建模结合业务整合工作流(一)

bmpn.js是什么? 先上图 初步认识bpmn.js 相关文档直接上链接 全网最详bpmn.js教材-基础篇 - 掘金bpmn.js是一个BPMN2.0渲染工具包和web建模器, 使得画流程图的功能在前端来完成. 因为公司业务的需要因而要在项目中使用到bpmn.js,但是由于bpmn.js的开发者是国外友人, 因此国…

【2023年中总结】是的,我从一家世界前百强企业毕业了,进入了一家只有20人的小企业。。。

我的2023-上 &#x1f550; 一、引言&#x1f55c; 二、新年&#x1f559; 三、措手不及&#x1f565; 四、抉择&#x1f55a; 五、适应&#x1f389;测试驱动开发&#x1f389;角色的转变&#x1f389;工作环境和生活环境的转变&#x1f389;工作态度 &#x1f566; 六、挑战&…

【裸机开发】定时器中断(EPIT)

EPIT 是周期性中断定时器&#xff0c;会定期调用指定的中断服务函数&#xff0c;其实可以看做是一种IRQ的外设中断&#xff0c;对应的中断ID是88&#xff08;5632&#xff09;或者 89&#xff08;5732&#xff09;。 目录 一、定时器计数流程 二、寄存器解析 1、EPIT1_CR 2…

骨传导耳机、运动耳机推荐:南卡OE开放式TWS耳机值得买吗?南卡OE测评

目前&#xff0c;如果说到骨传导耳机、蓝牙耳机想必大家都很熟悉&#xff0c;那你了解TWS耳机么&#xff1f; 如果说iPhone“重新定义”了智能手机&#xff0c;那么AirPods就重新定义了耳机——它“断”了耳机与手机/播放器间的连线&#xff0c;还将左右耳彼此间的连线彻底摒弃…

SimpleDateFormat显示24小时和12小时时间格式

public static void main(String[] args) throws Exception {MainTest1 mainTest1 new MainTest1();mainTest1.dateFormat();} yyyy-MM-dd HH:mm:ss格式显示的时间为:2017-06-12 18:01:06 yyyy-MM-dd hh:mm:ss格式显示的时间为:2017-06-12 06:01:06

二章:VMvare虚拟机的安装+VMvare安装winServer2008

目录 一、Vmware软件安装 二、Vmware软件注册 三、Vmware配置虚拟机-1 四、Vmware配置虚拟机-2 五、Vmware配置虚拟机-3 六、Vmware安装windows server 2008 一、Vmware软件安装 第一步 双击安装程序&#xff0c;点击下一步。 第二、三步 勾选接受许可&#xff0c;点击下一步。…

SAM【1】:Segment Anything

文章目录 前言1. Abstraction & Introduction1.1. Abstraction1.2. Introduction 2. Segment Anything Model2.1. Segment Anything Task2.1.1. Task2.1.2. Pre-training2.1.3. Zero-shot transfer 2.2. Segment Anything Model Methods2.2.1. Image Encoder2.2.2. Prompt …

python:并发编程(二十三)

前言 本文将和大家一起探讨python并发编程的实际项目&#xff1a;win图形界面应用&#xff08;篇五&#xff0c;共八篇&#xff09;&#xff0c;系列文章将会从零开始构建项目&#xff0c;并逐渐完善项目&#xff0c;最终将项目打造成适用于高并发场景的应用。 本文为python并…

微信小程序快速入门【二】

微信小程序快速入门【二】 文章目录 微信小程序快速入门【二】&#x1f468;‍&#x1f3eb;内容1&#xff1a;背景&#x1f468;‍⚖️内容2&#xff1a;项目结构&#x1f468;‍&#x1f4bb;内容3&#xff1a;项目配置文件app.json&#x1f468;‍&#x1f680;内容4&#x…

SpringBoot使用入门和案例实现

目录 1. 在pom.xml中添加依赖2. 编辑resources/application.properties3. 编写springboot的主程序4. 编写Controller程序5. IDEA本地测试6. 打包上传到服务器运行 1. 在pom.xml中添加依赖 步骤如下&#xff1a; 添加springboot的parent依赖添加springboot的starter-web依赖。…

osip开源库在windows平台上编译

背景 之前写过一篇关于sip协议栈选型的文章&#xff0c;最终采用了osip 2.3.6版本&#xff0c;文章中说明了为什么采用osip协议栈&#xff0c;以及为什么采用2.3.6版本。现在Linux上的产品已经基本满足需求了&#xff0c;接下来我们打算开发一套客户端和服务端对接&#xff0c…

电子邮件机器人和聊天机器人如何使您的客户支持受益?

当我们谈论客户支持中的人工智能时&#xff0c;通常会想到基于Web的聊天机器人。然而&#xff0c;现代人工智能的进步使电子邮件机器人成为客户支持自动化的下一个风口&#xff0c;使组织能够满足人们对于快速便捷的全渠道体验的期望。 有些人认为&#xff0c;与Facebook Mess…

“兆易创新杯”第十八届中国研究生电子设计竞赛有感

今年的电赛给我的感觉是时间真的紧张&#xff0c;可能是因为去年有疫情原因影响所以能准备的时间到七月份&#xff0c;今年不到月底就要全部出成品。我们团队一直在自研一款增强现实眼镜&#xff0c;从硬件设计到软件实现全部由我和另外两个小伙伴一起完成&#xff0c;所以就把…