- 博客(59)
- 收藏
- 关注
原创 spring ai实现多路召回检索增强advisor
本文探讨了在Spring AI框架中实现RAG(检索增强生成)检索的优化方案。针对现有检索增强器功能单一、组合复杂的问题,实现更全面、高效的混合检索增强方法。通过定义基础检索器抽象类并实现多种检索器(如BM25关键词检索、语义向量相似度检索等),结合检索器聚合工厂动态创建检索器列表。核心是实现了HybridRetrievalAdvisor,支持多路并行检索、文档去重合并和重排序,最终生成简洁高效的提示词。相比原框架实现,该方案显著提升了检索效率和准确性,避免了提示词冗余问题。
2025-12-12 10:48:50
675
原创 多路召回之-PGSQL的关键词检索分词插件安装
本文介绍了在自部署PostgreSQL中安装分词插件的两种方案,重点推荐jieba分词方案。详细说明了jieba分词的完整编译部署流程,同时简要介绍了zhparser分词的替代方案。分词插件为RAG应用中实现关键词检索提供了技术实现路径。
2025-12-06 14:07:53
286
原创 基于Spring AI的RAG和智能体应用实践
本文探讨了基于SpringAI框架构建企业级AI客服助手的实践方案。文章从某垂直领行业需求出发,提出了结合RAG检索增强、MCP协议工具链和LLM大模型的智能客服系统架构。重点介绍了系统设计中的关键环节:1) 采用SpringBoot+SpringAI微服务架构;2) 中文优化的文档分割与向量存储方案;3) 支持云知识库、本地文档和数据库文档的三层知识管理;4) 通过MCP协议实现标准化工具调用。工程提供了开源实现案例(https://github.com/endcy/base-ai-a)。
2025-11-15 16:52:29
764
原创 windows系统脚本切换多屏显示方式
多屏显示器在Windows系统中存在窗口最大化兼容性问题,当重新打开显示器时,部分程序(如IDEA、Chrome)会异常全屏化显示,遮挡任务栏。手动切换显示设置较为繁琐,建议通过编写bat脚本自动在"复制"和"扩展"显示模式间切换,简化操作流程。脚本可保存状态,双击运行即可快速恢复正常的窗口最大化显示,解决频繁出现的全屏显示异常问题,特别适合长期不关机的IT工作者使用。
2025-10-25 10:40:16
341
原创 qwen3和deepseek在线搜索API能力对比
摘要:对比DeepSeek和通义千问的联网搜索功能,测试结果显示DeepSeek在获取准确信息方面表现更优。以示例的查询垂直领域问题为例,DeepSeek能提供有据可查的正确答案,而千问存在数据偏差。通过多组测试数据验证,DeepSeek的实时搜索能力和结果准确性更适合生产环境需求,特别是在需要精确信息的工作场景中。虽然两者都存在部分误差,但DeepSeek整体表现更可靠,建议对结果要求高的场景优先选用。
2025-10-08 17:18:06
802
原创 mybatis-plus多租户兼容多字段租户标识
摘要:针对MyBatis-Plus默认租户插件仅支持单字段租户条件的局限性,本文提出了一种多字段租户插件的改造方案。通过定义扩展接口FixTenantLineHandler,实现根据表名动态获取不同租户字段(tenant_id1/tenant_id2/tenant_id3)和对应租户ID值。核心改造包括:1)重构处理器接口支持表名参数;2)利用MyBatis-Plus元数据自动判断表字段映射;3)重写SQL注入逻辑实现动态条件拼接。该方案无需额外配置即可适配多租户场景,相比其他方案更简洁高效。
2025-09-09 19:17:17
589
原创 IDEA maven加载依赖失败不展示Dependencies项
【摘要】低版本Maven(3.6.3及以下)在IDEA手动创建项目时可能出现Dependencies丢失问题,表现为模块仅显示Lifecycle且依赖报错。主要原因是parent工程pom.xml中dependencyManagement标签内存在未指定版本的依赖(如spring-boot-starter-tomcat),虽然继承父依赖理论上可行,但实际仍需显式声明版本号。解决方案:1)升级Maven至3.9.11可明确报错提示;2)为dependencyManagement中的依赖添加版本号或移除无版本依
2025-07-23 15:03:35
612
原创 Spring-Cache替换Keys为Scan—负优化?
使用ORM工具是往往会配合缓存框架实现三级缓存提高查询效率,spring-cache配合redis是非常常规的实现方案,如未做特殊配置,@CacheEvict(allEntries = true) 的批量驱逐方式,默认使用keys的方式查询历史缓存列表而后delete,而keys是阻塞式的命令,cache的dbsize越大,效率越低进而形成redis慢查询。而使用scan增量式迭代指令,配合自动游标批量扫描缓存匹配的缓存key,是一种非阻塞的方案,一般认为更适合用于大规模数据集的遍历,但事实似乎并不一定!
2025-04-25 10:56:47
822
原创 IoTDB结合Mybatis使用示例(增删查改自定义sql等)
时序库是当前越来越流行以及各大厂商越来越容易接收的国产开源时序数据库,针对IoTDB的内容不做过多介绍,在使用时序库时,往往入门门槛较高,不同于关系型数据库或文档型数据库那般方便维护和接入开发,虽然有官方文档的支持,以及一套SQL方案,但基于语言特性或者我们开发习惯,我们往往需要单独写一套方案来做接入支持。这里介绍了一套完整的Springboot(Spring Cloud)应用接入iotdb的方案支持,能够想关系型数据库一样,将对象作为一个时序模板,管理时序库数据。
2025-01-23 17:40:13
2024
原创 easypoi动态列分组导出
基于历史原因,项目数据导出使用easypoi工具包,需要对标签进行分组统计,列分组属于动态数据,可随需求变动查询而新增,由于历史的导出基于单表头,历史代码或文档亦或是参考源码提示,能较简单给出解决方案,但对于合并分组并存在相同子列的情况,较难找到解决方案的参考。遂记录此文。
2024-12-25 10:14:15
395
原创 使用mysql报Communications link failure异常解决
线上使用polarDB,基于mysql(5.7),建构为springboot+mybatisplus+durid连接池,部分业务场景涉及大表更新和查询操作,在查询慢sql且超过一定时间时就会报出"Communications link failure"异常,主要体现在界面查询或定时任务处理大批量数据是执行数据库的更新、查询异常。
2024-10-24 14:03:34
2455
2
原创 GitLab远程提交注释格式校验
feat 新功能fix 修复docs 文档变更style 代码格式refactor 重构perf 性能优化test 增加测试revert 回退build 打包chore 构建过程或辅助工具变动。
2023-10-28 09:51:29
1625
原创 分布式事务解决方案
严格意义上的事务实现应该是具备原子性、一致性、隔离性和持久性,简称 ACID。分布式事务顾名思义就是要在分布式系统中实现事务,它其实是由多个本地事务组合而成。目前常用和常被提及分布式事务解决方案有五种: 两阶段提交(2PC) 三阶段提交(3PC) 补偿事务(TCC=Try-Confifirm-Cancel) 消息队列(MQ) Sagas事务模型(最终一致性)下面就上述五种方案简单记录原理。二阶段提交两阶段提交2PC是分布式事务中最强大的事务类型之一,两段提交就是.
2022-04-26 10:09:55
2473
原创 深入理解Spring IOC和AOP
Spring IOC依赖反转是意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。是一种设计思想。IOC架构图软件系统中耦合的对象IOC解耦过程IOC和DI关系控制反转(IOC)是Spring框架的实现解耦的核心思想。控制反转一般分为两种类型,一个是依赖注入(DI)和依赖查找(DL),依赖注入应用更广泛。四连问1、谁依赖于谁应用程序依赖于IoC容器2、为什么需要依赖应用程序需要IoC容器来提供对象需要的...
2022-04-26 00:06:46
400
原创 SpringMVC中Controller返回的后续自定义处理
应用范围和场景 和统一异常处理不同,有些时候Controller处理可能需要做后续处理,例如关键字拦截,例如数据脱敏等,使用切面的方式比较复杂,如果Controller里需要后续处理的接口使用的都是@ResponseBody注解,那么实现ResponseBodyAdvice接口将是非常便利的处理方法,当然使用拦截器、HandlerMethodReturnValueHandler接口实现也是几种方法,这里仅示例更简单的ResponseBodyAdvice接口使用实现。应用示例 ...
2021-05-11 19:32:29
896
原创 SpringBoot集成slf4j+log4j并输出到加密密码的数据库
本文根据实战经验复写SpringBoot+slf4j+log4j的日志集成方式,并配置相关控制台、文件、密码加密数据库输出打印等方式。1、SpringBoot项目中的log4j maven相关依赖和原logback(SpringBoot自带)解除: <dependency> <groupId>org.springframewo...
2018-11-30 18:10:35
1948
转载 GIT常用命令格式解析
git init 在本地新建一个repo,进入一个项目目录(项目命名文件夹),执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹. git clone 获取一个url对应的远程Git repo, 创建一个local copy. 一般的格式是git clone [url]. url可以设置为github上的“Clone wi...
2018-11-08 10:50:59
1333
原创 装饰器模式、JDK动态代理和CGLIB动态代理三种AOP实现
AOP即对OOP的补充,面向切面的编程方式增强面向对象思想的功能,概念之类的问题这里不做阐述,直接上代码实现细节,具体原理需要深入源码理解。测试功能,定义一个普通service类,利用AOP不修改原来类代码实现嵌入这个类的日志打印。定义一个DAO接口:public interface DAO { public boolean insert(); public bool...
2018-10-15 10:25:36
799
原创 JAVA模拟高并发及多线程计数器
1、多线程高并发模拟实现可采用闭锁CountDownLatch,设置对应线程数的CountDownLatch,达到就绪条件后会多线程统一执行。这里只是单机模拟,因为线程采用抢占式执行方式,并不能完全模拟统一同时执行。2、多线程计数器可采用悲观锁CAS实现类AtomicInteger等原子操作方法实现。import java.util.concurrent.CountDownLatch;...
2018-10-12 17:26:59
2744
1
转载 LinkedBlockingQueue和ArrayBlockingQueue的区别
源码分析见:https://blog.youkuaiyun.com/javazejian/article/details/77410889LinkedBlockingQueue和ArrayBlockingQueue的区别:1.队列大小有所不同,ArrayBlockingQueue是有界的初始化必须指定大小,而LinkedBlockingQueue可以是有界的也可以是无界的(Integer.MAX_...
2018-09-07 10:54:59
639
原创 GIT控制台恢复删除的文件
例如在库的根目录中,先查看本地更改包含被误删的文件列表:git status上图包含了build/build.js和package.js文件。使用 git pull恢复build目录中的build.js文件,查看文件夹,发现无法通过pull命令来恢复。使用命令:git branch -a查看当前分支,如果不在需要恢复的分支上,需要切换到目标分支:git checkout...
2018-08-30 14:53:28
3178
转载 git dev分支合并到master分支并提交
在代码库本地文件夹打开git bash操作或者命令提示符窗口,操作步骤如下。 $ git branch -a #先查看下当前的本地和远程分支* master remotes/origin/HEAD -> origin/master remotes/origin/dev ...
2018-08-09 16:48:30
13684
1
转载 Mabits出现Does not contain value for…错误
Mapped Statements collection does not contain value for后面是什么类什么方法之类的: 错误原因有几种: 1、mapper.xml中没有加入namespace 2、mapper.xml中的方法和接口mapper的方法不对应 3、mapper.xml没有加入到mybatis-config.xml中(即总的配置文件),例外:配置了ma...
2018-07-24 11:41:59
3456
1
原创 Spring MVC获取URL参数及请求参数
只要把什么叫请求路径,什么叫请求参数分清楚,也就能理解@PathVariable和@RequestParam。注意:代码中的RequestMapping地址是SpringMVC注解匹配的同名称请求,如果在类仅仅是注明 @Controller 那么此RequestMapping下的方法方法将会解析所有传给服务后台的page.do操作;如果声明类前先@Controller 并又注明了一个@Reque...
2018-07-24 11:40:52
13828
2
原创 jquery记住表单用户密码示例
function setCookie() { var loginCode = $("#userName").val(); var pwd = $("#password").val(); var checked = $('#remberMe').prop('checked') ? true : false; if (check...
2018-07-24 11:33:07
953
原创 JS禁用退格键防页面返回(不影响表单等编辑)
我们在真实的项目开发中经常会使用JS 对键盘上的一些按键进行禁用,常见的比如说退格键(backspace/ 后退键),防止在非编辑的状态下按了退格键整个界面都返回上以历史页面,这将会导致所有已编辑的数据丢失,所以有必要在这种前端界面屏蔽掉非表单编辑状态下的退格键按键操作。js代码如下:<script type="text/javascript"> ...
2018-07-24 11:27:14
1828
原创 jquery表单校验规则及示例
jquery表单校验,必须引入jquery.validator.js文件。1、js的$(function(){}中初始化校验参数及校验规则;$(function () { var $form = $('#addJobInfo'); var $form = $('#addJobInfo'); $form.validator({ debug: false...
2018-07-24 11:22:37
1410
原创 eova、easyui及普通DOM表单元素操作
-----eova组件$('#jobCron').eovaedit().setText('');$('#invalTime').eovatext().setValue('');var jobCron = $('#jobCron').eovaedit().getValue();var invalTime = $('#invalTime').eovatext().getValue();所有...
2018-07-24 11:19:01
904
转载 CSS或JS路径引用问题
引用外部.css或.js文件的路径问题 jsp或html页面引用外部.css或.js文件时,注意路劲问题,如果设置不当,会引用不到这些外部的文件假设使用下面的目录结构:-webapp |-MyProject 目录 |--WebContent 目录 |---scripts 目录 ---dtree.js 文件 |---styles 目录 ---main.css 文件 ...
2018-07-24 11:11:08
4734
原创 字符图片验证码的java实现
这里仅写出验证码程序的生成方式和Servlet访问应用,具体的应用场景可以变更,例如可以将方法至于单独处理类,供MVC调用等等。import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.Buf...
2018-07-24 11:09:43
286
原创 运行多Tomcat服务端口及标题的设置
一台机器运行多Tomcat的设置:1、Tomcat复制两份分别重命名成tomcat11111和tomcat22222(按需求设置)2、(可选)修改其中一个tomcat中的某些参数,为了避免启动tomcat时出现冲突,编辑bin/startup.bat,在文件第一行添加如下两行 SET JAVA_HOME=C:\websoft\jdk1.6.0_33 (JDK所在路径) ...
2018-07-24 11:01:30
625
原创 Servlet+Ajax实现简单登录验证
具体实现步骤如下: 1.下载jquery库 jquery-1.3.2.js2.把它放在一个web工程webroot目录下面的一个文件夹里面(如 js文件夹里面) 3.编写服务器端的程序: AjaxServlet.java public class AjaxServlet extends HttpServlet { protected void doGet(HttpServl...
2018-07-24 10:48:55
4736
原创 AJAX触发取值或弹窗确认请求返回
ajax触发: $.ajax({ type: 'POST', url: "/jobinfo/loadById", cache: false, async: false, dataType: "json", data: { "ID": oUrlParam["ID"] ...
2018-07-23 17:18:17
3847
原创 Oracle时间点历史数据恢复[回闪]
通过时间点对应数据表状态进行历史数据恢复 这里数据表以cfg_business_adapter为例,数据误删时间为20160923 10:10:00,进行恢复操作如下。1、查询表数据select t.*, t.rowid from cfg_business_adapter t,误删后显示为空。 2、通过时间间隔确定需恢复的时间点,在没有恢复之前, 通过查询该时间点确认数据为删前数据,用...
2018-07-23 17:14:16
17421
2
原创 Maven将依赖多jar的项目打成一个可执行jar
利用maven的assembly插件或者shade插件可实现将依赖多个jar包的项目打成一个jar大jar包。1、将项目依赖的多个jar打入maven仓库中,例如mvn install:install-file -DgroupId=com.bank -DartifactId=UnionNew -Dversion=1.0.0 -Dpackaging=jar -Dfile=d:/UnionNew....
2018-07-23 17:08:57
4066
转载 ORACLE创建Jobs详解及示例
主要的使用情景 定时在后台执行相关操作:如每天晚上0点将一张表的数据保存到另一张表中;定时备份数据库等 这里只简单记述一个创建一个简单的job 步骤如下: 1、创建一张表g_test create table G_TEST ( ID NUMBER(12), C_DATE DATE ) 2、创建一个sequence create sequence G_SEQ minv...
2018-07-23 16:57:39
6343
转载 ORACLE中的char和vchar类型
在Oracle数据表和程序类型中,字符类型可能是使用最多的一种了。从历史上看,Oracle首先推出了固定长度char类型字段,之后才推出了变长度类型varchar2。目前,主流Oracle应用开发都已经普遍接受了varchar2作为数据表字段类型表示。如果存在超长字符,都考虑使用CLOB这类大对象进行存储。但是,我们在实际领域中,还是会在各种遗留系统中发现很多char类型字段。而且...
2018-07-23 16:55:45
2230
原创 ORACLE利用序列实现ID自增
1、仅使用序列产生自增主键序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。 创建序列语法如下:c...
2018-07-23 16:53:24
13309
原创 查询重复记录或删除多余重复记录
下面以流水表作为例子。查询重复记录:select t.*,t.rowid from cmbcproxy_app_trans t where t.appseqid in(select b.appseqid from cmbcproxy_app_trans b group by b.appseqid having count(b.appseqid)>1)删除重复记录保留rowid...
2018-07-23 16:49:41
293
原创 JAVA时间戳转为ORACLE时间串
在java中,调用System.currentTimeMillis()获取到系统当前时间的UNIX时间戳是以毫秒为单位的,但是ORACLE中,如果需要将时间戳转为时间或者时间字符串,必须先除以1000,该互转如下。 JAVA获取时间戳:long time = System.currentTimeMillis();ORACLE转换为时间:select ( to_date('1970...
2018-07-23 16:47:43
2454
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅