基于git推送的ES检索pdf内容优化思路与代码实现

写在前面

在之前的内容中我们已经介绍了创建gitbucket的webHook,使得仓库有更新时自动推送到我们定义的接口;然后Java读取仓库的文件转码写入ES库,这些核心流程已经实现。

1. 实现ES检索pdf等文件内容的插件

2. 基于GitBucket的Hook构建ES检索PDF等文档全栈方案

3. Java实现读取转码写入ES

在在我们的现有系统中,我们已经实现了自动化识别并记录文件类型的能力,无论是纯文本、PDF还是其他格式,都将作为一个ES属性加以记录,这对于后续根据不同文件类型实施针对性处理至关重要。

优化思路

当我们聚焦于Git库与Java开发环境时,我们应当进一步收集和整合文件的关键元数据,诸如文件标签以方便分类和检索,文件作者信息便于版权追踪和贡献度统计,以及文件的更新日期和版本信息,确保每一次变更的历史记录得以精确维护。

若将这一机制与Elasticsearch(ES)相结合,我们将增强对文件内容和元数据的实时索引能力,实现文件识别与Git仓库活动的联动。每当Git库中发生文件的新增、更新或删除操作时,系统都能自动感知并同步至ES,确保索引内容与实际仓库状态始终保持一致,从而实现高效的全文检索和分析。

具体的实现步骤及代码:

索引的映射结构优化

首先ES索引新增了更新时间、active等字段及类型设定。

PUT /docwrite
{"mappings": {"properties": {"id": {"type": "keyword"},"title": {"type": "text","analyzer": "ik_max_word"},"fileType": {"type": "keyword"},"active": {"type": "boolean"},"upTime":{"type": "date","format": "yyyy-MM-dd HH:mm:ss||epoch_millis"},"attachment": {"properties": {"content": {"type": "text","analyzer": "ik_smart"}}}}}
}

文件作者与标签

作者信息不是解析的文档属性,由于我接收的是git推送消息,所以我直接从消息体属性获取,大致是这样的。

String author = getValueByPath(info, "author.name");

文件标签是大多数文档都没有的,所以要么使用自定义的规则,要么就使用文件名分词,更高级的做法是做文章内容的摘要抽取关键词。
我的做法属于自定义规则类,因为我的文件总体上是属于git库的一部分,所以文件自身所在的目录就是它的类型,只要我们在创建文件夹时规范一下就可以了。山不过来我过去,业务上的规范设计能够使得代码逻辑更为简洁!

核心代码如下(当没有上级目录时,记作未定义):

// 获取最后一级目录的名称,即文件的标签  
String tag = path.getParent() != null ? path.getParent().getFileName().toString() : "未定义";

更新日期的处理

git推送信息的日期字段是不太兼容的文本类型,我们将其变换为ES支持的时间戳类型:

import java.time.OffsetDateTime;  
import java.time.format.DateTimeFormatter;private static long dateToTimestamp(String dateStr) {  // 创建一个与ISO8601兼容的日期时间格式化器  DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;  // 解析字符串为OffsetDateTime对象  OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateStr, formatter);  // 将OffsetDateTime转换为时间戳(毫秒)  return offsetDateTime.toInstant().toEpochMilli();  
}

文件唯一性识别

使用文件相对路径及文件名生成一段Hash值,如果使用SHA-256的算法,内容很长:
很长的sha256值

但如果截断的话会大幅升高冲突概率(实际上也很低),故而采用MD5摘要算法尚可以接受:

Get INFO: Kelvin,Welcome to 1024!
File name MD5: bc4780da18a605a226798e46971e3fa1

实现代码:

import java.nio.charset.StandardCharsets;  
import java.security.MessageDigest;  
import java.security.NoSuchAlgorithmException;public static String generateHash(String fileName) throws NoSuchAlgorithmException {  MessageDigest md = MessageDigest.getInstance("MD5"); // 获取MD5实例  byte[] bytesOfFileName = fileName.getBytes(StandardCharsets.UTF_8); // 将文件名转换为字节数组,确保编码正确  md.update(bytesOfFileName); // 更新摘要信息  byte[] digest = md.digest(); // 计算摘要  StringBuilder sb = new StringBuilder();  for (byte b : digest) {  sb.append(Integer.toHexString((b & 0xFF) | 0x100), 1, 3);  }  return sb.toString(); // 这就是MD5哈希值  
}

文件的删除

当推送信息里是删除操作时,我们需要将对应的索引文档也删除,那么沿用上面文件的MD5值进行判断,使用效率最高的按ID删除。

但是数据作为企业的宝贵资产,尤其是文档这种体量一般不大,更常见的做法是执行软删除,也就是找到文档将其标记为不可见(我已经提前设计了active布尔字段来记录)。

存在或发现的问题

  1. ES7.3实测无法索引docx和doc文档,content有值但是无法解析到附件成为可读的可搜索的内容,附件内容为空(附件中根本没有content这个字段,并非内容为空)。
  2. 理论上可以直接tika解析它的内容直接传递给ES。

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

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

相关文章

解决虚拟机静态网址设置后还是变动的的问题

源头就是我的虚拟机静态网址设置好了以后但是网址还是会变动 这是我虚拟机的配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 这是出现的问题 进入这里 cd /etc/sysconfig/network-scripts/ 然后我去把多余的ens33的文件都删了 然后还不行 后来按照这个图片进行了下 然后…

中国电信提速云计算重庆基地二期项目开建预计2020年底建成

4月3日,中国电信重庆公司消息称,在大力加快5G网络、数据中心等新型基础设施建设的同时,中国电信全面加快云计算重庆基地项目二期建设。 该项目拥有超过20万套。 服务器运营能力预计年内完成。 据重庆电信相关负责人介绍,中国电信水…

YOLOv8-Seg改进:特征融合篇 | GELAN(广义高效层聚合网络)结构来自YOLOv9

🚀🚀🚀本文改进:使用GELAN改进架构引入到YOLOv8 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性能; 3)独家自研模块助力分割; 1.YO…

Spring学习 基础(二)Bean和AOP

3、Spring Bean Bean 代指的就是那些被 IoC 容器所管理的对象,我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。 Bean的创建方式 1. XML 配置文件: 传统上&am…

打开stable diffusion webui时,提示缺少clip或clip安装不上怎么办

在当前数字化时代,软件工具的应用已经成为人们日常生活和工作中不可或缺的一部分。而在使用各种软件工具的过程中,遇到一些技术性问题也是常有的事情。比如,在打开 Stable Diffusion WebUI 这样一个功能强大的工具时,有时会遇到缺…

python基础篇--学习记录2

1.深浅拷贝 l1 ["张大仙","徐凤年",["李淳刚","邓太阿"]] # 变量名对应的就是内存地址,这里就是将l1的内存地址给了l2 # 现在两个变量指向同一个内存地址,l1变化l2也会变化 l2 l1 现在的需求是l2是l1的拷贝版本,但是两者是完全分割…

基于 HBase Phoenix 构建实时数仓(2)—— HBase 完全分布式安装

目录 一、开启 HDFS 机柜感知 1. 增加 core-site.xml 配置项 2. 创建机柜感知脚本 3. 创建机柜配置信息文件 4. 分发相关文件到其它节点 5. 重启 HDFS 使机柜感知生效 二、主机规划 三、安装配置 HBase 完全分布式集群 1. 在所有节点上配置环境变量 2. 解压、配置环境…

微信小程序onLoad加载定义好的函数

这里小程序开发中容易犯的错误-1写自定义目录标题 给客户做一个程序。需要在页面加载的时候在onLoad(options){}中加载定义好的函数,代码如下 onLoad(options) {get_week_()},运行时老报错 后来修改为正确的代码 onLoad(options) {this.get_week_()//必须加this},再…

YOLOv8优化策略:SPPF涨点篇 |引入YOLOv9的SPPELAN

🚀🚀🚀本文改进:SPP创新结合ELAN,来自于YOLOv9,助力YOLOv8,将SPPELAN代替原始的SPPF 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.YOLOv9介绍 论文: 2402.13616.pdf (arxiv.org) 摘要: 如今…

Linux的top命令解析

Top命令是什么 TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。 TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系…

RT-DETR优化改进:下采样涨点篇 |引入YOLOv9的下采样ADown

🚀🚀🚀本文改进:YOLOv9的下采样ADown助力RT-DETR,将ADown添加在backbone和head处,提供多个yaml改进方法 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 🚀🚀🚀学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 🚀🚀🚀RT-DETR模型…

LeetCode Python - 41. 缺失的第一个正数

目录 题目答案运行结果 题目 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释&#xff1a…

Java List集合取交集的八种不同实现方式

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在Java中,取两个List集合的交集可以通过多种方式实现,包括使用Java 8的Stream API、传统的for循环遍历、使…

KH-MCX-KWE-W

KH-MCX-KWE-W品牌: kinghelm(金航标)封装: 插件 描述: 镀金

试题 算法训练 强力党逗志芃

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能。现在我们可以了解到,每个技能…

第七十九天 WAF攻防-漏洞发现协议代理池GobyAWVSXray

第79天 WAF攻防-漏洞发现&协议&代理池&Goby&AWVS&Xray 知识点: 1、Http/s&Sock5协议 2、Awvs Xray&Goby代理 3、Pxoxifier进程代理使用 4、Safedog&BT&Aliyun防护 演示案例: Awws漏扫-Sadedog-白名单-内置 Awws漏…

webpack5:基本概念整理

写在前头:这篇文章只是我个人在学习过程中对webpack文档的简单总结,更多详细信息请在官网阅读。 一、webpack是什么 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口…

鸡肋的Git

1.前言 对于大多数开发人员来说,我们大多数在学习或者工作过程中只关注核心部分,比如说学习Java,可能对于大多数人而言一开始都是从Java基础学起,然后408,Spring,中间件等,当你发现很多高深的技…

开源的Java报表库JasperReports介绍

JasperReports 是一个流行的开源 Java 报表库,它允许开发人员创建丰富的、基于 Java 的报表,这些报表可以与多种数据源交互,并且可以很容易地集成到 Java 应用程序中。JasperReports 提供了丰富的功能,包括数据可视化、图表、子报…

Node.js与Webpack笔记(二)

上一篇:Node.js与Webpack笔记(一)-CSDN博客 Webpack模块打包工具 1.Webpack简介以及体验 webpack是一个静态模块打包工具,从入口构建依赖图,打包有关的模块,最后用于展示你的内容 静态模块:编写…