Apache Tika入门

2023-11-05

1、基本介绍

Apache Tika(文本分析工具包)能够检测并提取来自上千种不同文件类型(如PPT、XLS和PDF)的元数据和文本;所有这些文件类型都可以通过一个接口进行解析,这使得Tika在搜索引擎索引、内容分析、翻译等方面非常有用。

2、Tika使用

介绍下Tika在Maven项目中的使用,首先介绍下Tika相关的两个Maven依赖:

 <dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>1.26</version>
 </dependency>
 <dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>1.26</version>
 </dependency>

tika-core:包含Tika的关键接口和类,如果不需要来自Tika解析器组件的完整解析器集,可以单独使用。
tika-parsers:如果您想使用Tika来解析文档(而不是简单地检测文档类型等等),需要引入该依赖。

2.1、解析器接口(The Parser interface)

Parser是tika的核心概念,它隐藏了不同文件格式和解析库的复杂性,为客户端程序提供了一个简单而强大的机制,用来从各种各样的文档中提取元数据和结构化文本内容,所有文档的解析使用一个接口来实现:

/**
*@param stream 所要解析文档的输入流
*@param handler 内容处理器,用来收集结果,Tika会将解析结果包装成XHTML SAX event进行分发,通过ContentHandler处理这些event就可以得到文本内容和其他有用的信息
*@param metadata 用于向解析器内外传递文档元数据。
*@param context 解析上下文有两个功能
* 1)向解析过程注入特定上下文,例如:在Microsoft Excel电子表格中处理特定地区的日期和数字格式
* 2)将委托解析器实例传递给两阶段解析器(如PackageParser子类)使用
**/
void parse(InputStream stream, ContentHandler handler, Metadata metadata,
    ParseContext context) throws IOException, SAXException, TikaException;

在所有的解析器类中有一个典型类:AutoDetectParser,将所有Tika功能封装到一个可以处理任何类型文档的解析器中;默认使用的就是该解析器。

2.1.1、自定义Parser类

在Tika工具包中,有一个与MIME-Types有关的配置文件:custom-mimetypes.xml 但是如果要对一个全新的MIME-Type文件进行解析,则可以自定义解析器,步骤如下:

  • 自定义一个文件org/apache/tika/mime/custom-mimetypes.xml,文件格式如下,以application/hello为例来介绍:
 <?xml version="1.0" encoding="UTF-8"?>
 <mime-info>
   <mime-type type="application/hello">
          <glob pattern="*.hi"/>
   </mime-type>
 </mime-info>
  • 定义一个解析器类,该类可以实现Parser接口,也可以去继承抽象类AbstractParser,一般建议继承抽象类,实现如下:
public class HelloParser extends AbstractParser {
   private static final Set<MediaType> SUPPORTED_TYPES = Collections.singleton(MediaType.application("hello"));
   public static final String HELLO_MIME_TYPE = "application/hello";
   public Set<MediaType> getSupportedTypes(ParseContext context) {
        return SUPPORTED_TYPES;
   }
   public void parse(InputStream stream, ContentHandler handler,
                     Metadata metadata, ParseContext context)
                     throws IOException, SAXException, TikaException {
       metadata.set(Metadata.CONTENT_TYPE, HELLO_MIME_TYPE);
       metadata.set("Hello", "World");
       XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
       xhtml.startDocument();
       xhtml.endDocument();
  }
}

如果想要使用AutoDetectParser类的功能时,可以将自定义的parser,添加到org.apache.tika.parser.Parser文件中,在项目/src/main/resources 下添加META-INF/services/org.apache.tika.parser.Parser 文件,然后把自定义的parse包名配置上即可,可以参考:org.apache.tika.parser.Parser配置举例

2.2、检测器接口

检测器接口是是实现文本检测的基础,该接口的方法如下:

/**
*@param input 要检测文档的输入流
*@param metadata 文档元数据信息,该元数据信息通常需要包含两个关键值:
* 1)RESOURCE_NAME_KEY,它应该包含文件的名称(已知的),以及元数据;
* 2)CONTENT_TYPE,它应该包含该文件发布的内容类型(例如来自web服务器或内容存储库)。
**/
MediaType detect(java.io.InputStream input,Metadata metadata) throws java.io.IOException

Tika提供了一个特殊的检测器org.apache.tika.detect.DefaultDetector,它在运行时自动检测(基于服务文件)可用的检测器,并依次尝试这些检测器来识别文件类型;默认使用该注册器。

2.3、Tika配置

在使用时,可以使用Tika的配置xml文件实现Tika的配置,从而控制哪些类型的文件,使用哪些类型的解析器等等,具体的可配置项可以参考:Tika配置 ,这里举一个配置文件的例子:

<?xml version="1.0" encoding="UTF-8"?>
<properties>
  <parsers>
    <!-- Default Parser for most things, except for 2 mime types, and never
         use the Executable Parser -->
    <parser class="org.apache.tika.parser.DefaultParser">
      <mime-exclude>image/jpeg</mime-exclude>
      <mime-exclude>application/pdf</mime-exclude>
      <parser-exclude class="org.apache.tika.parser.executable.ExecutableParser"/>
    </parser>
    <!-- Use a different parser for PDF -->
    <parser class="org.apache.tika.parser.EmptyParser">
      <mime>application/pdf</mime>
    </parser>
  </parsers>
</properties>

接下来使用配置文件:

TikaConfig config = new TikaConfig("/path/to/tika-config.xml");
Detector detector = config.getDetector();
Parser autoDetectParser = new AutoDetectParser(config);

关于Tika更多的使用,可以参考官网使用举例:Tika使用举例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache Tika入门 的相关文章

随机推荐

  • 求一行字符串的长度。(C语言)

    代码 include
  • hadoop集群搭建

    文章目录 一 基本配置 所有节点 一 配置静态网络 二 修改主机名和修改host文件 三 禁用SELINUX 四 关闭防火墙 并取消开机自启动 五 配置NTP时间同步 集群所有节点 六 下载一下vim编辑器 七 安装JDK1 8 八 创建h
  • 【Mysql高级】【第十五章】【锁】

    锁 1 概述 2 Mysql并发实务访问相同记录 2 1 读 读 2 2 写 写 2 3 读 写或者写 读 2 4 并发问题的解决方案 3 锁的不同角度分类 3 1 从数据操作的类型划分 读锁 写锁 0 行级别x锁 和 s锁的兼容性问题 1
  • qt connect多次

    1 坑的现象 有时项目中一个信号发出 对应连接的槽函数会执行多次 普通刷新界面都不会有问题 但是特别频繁的就会影响性能 如果是改变数据的 更有甚者会异常崩溃 2 遇坑的原因 qt中同一实例的同一信号和槽 connect多次 当信号发出时 槽
  • AD9 PCB文件黑色区域如何改变?

    PCB的大小是由KeepOut层定义的 用机械层定义有时候 黑色区域无这方面的意义 改变黑色区域大小可以用Design BoardShape RedefineBoardSharp来完成
  • 国内外常用公共NTP网络时间同步服务器地址

    目录 太长不看 NTP Pool Project NTP ORG CN NTP授时快速域名服务 HSDN Home Server Data Network 本地服务器数据网络 企业 阿里巴巴 腾讯 微软 苹果 谷歌 Facebook Clo
  • 从零开始学C++之STL(一):STL六大组件简介

    一 STL简介 一 泛型程序设计 泛型编程 generic programming 将程序写得尽可能通用 将算法从数据结构中抽象出来 成为通用的 C 的模板为泛型程序设计奠定了关键的基础 二 什么是STL 1 STL Standard Te
  • 高校圆桌派-解惑关于IT行业的3+N个问题

    高校圆桌派 话题风暴等你来 即日起参与 高校圆桌派 活动 就有机会获得CSDN高校圆桌大礼包和CSDN周边礼品免费包邮送到家 关于高校圆桌派 高校圆桌派活动是由CSDN高校俱乐部官方发起 征集同学们感兴趣的IT行业问题或大家最关心的热门话题
  • matlab中imrote,基于MATLAB的车牌识别系统的设计与研究

    基于MATLAB的车牌识别系统的设计与研究 基于MATLAB的车牌识别系统的设计与研究 摘要 汽车牌照自动识别系统是智能交通系统的重要组成部分 主要包括图像采集 图像预处理 车牌定位 字符分割 字符识别等五个核心部分 并提出了一套基于MAT
  • html左边多级菜单导航栏,精美的多级侧边栏导航菜单jQuery插件

    这是一款基于bootstrap的精美多级侧边栏导航菜单jQuery插件 该导航菜单在bootstrap样式的基础上 通过jQuery来为导航菜单绑定菜单点击事件 生成非常漂亮的多级侧边栏导航菜单 使用方法 在页面中引入bootstrap样式
  • prometheus监控k8s kube-proxy target down

    prometheus kube proxy target down 解决 修改配置 kubectl edit cm kube proxy n kube system metricsBindAddress 0 0 0 0 10249 删除 k
  • 2050年全部人口的86%集中到城市,智慧城市的五项关键技术

    本文翻译至 http readwrite jp cities 32108 人口的城市化毫不停息 人们的住所越来越多地从地方移动到城市 到2050年为止预计发达国家人口的86 发展中国家人口的64 将住在城市 数量有限的城市要负担如此多的人口
  • 查看并设置Linux的IP地址

    ip addr 查看网卡分配情况 如发现IP地址为 127 0 0 1 这里要修改ip地址 修改IP地址方法 1 进入 etc sysconfig network scripts 注 不同版本ifcfg ens33文件名可能会不一样 2 修
  • Visual C++ MFC的图形绘制——常见问题汇总

    Visual C MFC的图形绘制 常见问题汇总 目录 一 常见问题 1 菜单界面制作 2 命令响应函数 3 添加私有变量 4 消息响应函数 二 后记 三 补充代码 一 常见问题 1 菜单界面制作 题目描述 新建一个单文档类型的MFC Ap
  • 别再写满屏的 if、else 了,试试策略模式

    你还在写满屏的 if else switch 之类的判断逻辑吗 栈长在开发人员的代码中看过太多这样的低级代码了 真的太 low 极不好维护 本文栈长就教你如何用策略模式干掉 if else switch 让你的代码更优雅 什么是策略模式 比
  • 一起自律打卡社群第3期

    如果你愿意 你可以变得更好 社群大家都知道是怎么回事 建这个群组主要就是互相鼓励 一起前进 不要在生活或工作学习中处于一种颓废的状态 干啥都提不上劲 对生活也没有多大的期望 其实都是懒散惯了 导致对生活缺少一种积极的能量 从而想伪躺平当个咸
  • 电脑系统重装后触控板用不了了(消失了)

    问题 win10系统重装后发现触控板用不了 消失了 如图 正常的情况应该如图下 造成这种情况的原因 1 可能是误删触控板驱动 2 可能是重装系统的时候触控板驱动没打上 3 可能是触控板因进水 撞击损坏 4 略 可能因素太多了 这次我主讲华硕
  • express+websocket实现线上聊天

    1 webSocket简介 WebSocket是一种通信协议 可在单个TCP连接上进行全双工通信 WebSocket使得客户端和服务器之间的数据交换变得更加简单 允许服务端主动向客户端推送数据 在WebSocket API中 浏览器和服务器
  • 静态类型推导

    前面说泛型的时候 提到了C 模板的实现方式是动态特性静态化 在实际情况中 这是一个提高效率的好办法 动态性的好处是灵活 开发简便 静态性的特性是效率高 编译期检查较好 因此很自然地就有一个问题 能不能各取所长 达到两全其美 应该说 在一定程
  • Apache Tika入门

    文章目录 1 基本介绍 2 Tika使用 2 1 解析器接口 The Parser interface 2 1 1 自定义Parser类 2 2 检测器接口 2 3 Tika配置 1 基本介绍 Apache Tika 文本分析工具包 能够检