在上一篇文章中 ,lucene只能全文检索word2003,无法检索2007,并且只能加载部分内容,无法加载全文内容。为解决此问题,找到了如下方法

POI 读取word (word 2003 和 word 2007)

最近在给客户做系统的时候,用户提出需求,要能够导入 word 文件,现在 microsoft word 有好几个版本 97、2003、2007的,这三个版本存储数据的格式上都有相当大的差别,而现在 97 基本上已经退出市场,几乎没有人用这个版本了, 所以在我们的系统中只考虑 2003 版本和 2007 版本的,因为我们只要求能够读取 word 中的文字内容即可,其中的文字样式、图片等信息可以忽略,也不用直接操作 word 文件, 所以我们选择 用 apache 的 POI 进行读取。

读取 2003 版本(.doc)的word文件相对来说比较简单,只需要 poi-3.5-beta6-20090622.jar 和 poi-scratchpad-3.5-beta6-20090622.jar 两个 jar 包即可, 而 2007 版本(.docx)就麻烦多,我说的这个麻烦不是我们写代码的时候麻烦,是要导入的 jar 包比较的多,有如下 7 个之多:
 1. openxml4j-bin-beta.jar
 2. poi-3.5-beta6-20090622.jar
 3. poi-ooxml-3.5-beta6-20090622.jar
 4 .dom4j-1.6.1.jar
 5. geronimo-stax-api_1.0_spec-1.0.jar
 6. ooxml-schemas-1.0.jar
 7. xmlbeans-2.3.0.jar
其中 4-7 是 poi-ooxml-3.5-beta6-20090622.jar 所依赖的 jar 包(在 poi-bin-3.5-beta6-20090622.tar.gz 中的 ooxml-lib 目录下可以找到)。

编写代码之前我们得先下载所需要的 jar 包, 我们只需下载 poi-bin-3.5-beta6-20090622.tar.gz 和 openxml4j-bin-beta.jar 即可,因为所需要的其他 jar 包都能在 poi-bin-3.5-beta6-20090622.tar.gz 中找到, 下面是下载地址:
poi-bin-3.5-beta6-20090622.tar.gz:http://apache.etoak.com/poi/dev/bin/poi-bin-3.5-beta6-20090622.tar.gz
openxml4j-bin-beta.jar:http://mirror.optus.net/sourceforge/o/op/openxml4j/openxml4j-bin-beta.jar
 
    下方是读取 word 文件的 Java 代码,值得注意的是: POI 在读取 word 文件的时候不会读取 word 文件中的图片信息, 还有就是对于 2007 版的 word(.docx), 如果 word 文件中有表格,所有表格中的数据都会在读取出来的字符串的最后。

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;/*** POI 读取 word 2003 和 word 2007 中文字内容的测试类<br />* @createDate 2009-07-25* @author Carl He*/
public class Test {public static void main(String[] args) {try {//word 2003: 图片不会被读取InputStream is = new FileInputStream(new File("c://files//2003.doc"));WordExtractor ex = new WordExtractor(is);String text2003 = ex.getText();System.out.println(text2003);//word 2007 图片不会被读取, 表格中的数据会被放在字符串的最后OPCPackage opcPackage = POIXMLDocument.openPackage("c://files//2007.docx");POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);String text2007 = extractor.getText();System.out.println(text2007);} catch (Exception e) {e.printStackTrace();}}
}

 找到方法后,我们对上一篇文章indexer.java的源码进行更改,新增函数getDocument2007(),getDocument2003()

本版本lucene是4.9

    public static Document getDocument2007(File file) throws Exception {String docPath = file.getAbsolutePath();String title = file.getName();// 鍒涘缓DocumentDocument document = new Document();OPCPackage opcPackage = POIXMLDocument.openPackage(docPath);POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);String cont = extractor.getText();document.add(new StringField("filename", title, Field.Store.YES));//TOKENIZED//document.add(new Field("contents", contents));document.add(new TextField("contents", cont,Field.Store.YES));document.add(new TextField("path", docPath, Field.Store.YES));document.add(new StringField("indexDate",DateTools.dateToString(new Date(), DateTools.Resolution.DAY),Field.Store.YES));return document;}public static Document getDocument2003(File file) throws Exception {String docPath = file.getAbsolutePath();String title = file.getName();// 鍒涘缓DocumentDocument document = new Document();InputStream is = new FileInputStream(new File(docPath));WordExtractor ex = new WordExtractor(is);//is鏄疻ORD鏂囦欢鐨処nputStream String cont =  ex.getText();document.add(new StringField("filename", title, Field.Store.YES));//TOKENIZEDdocument.add(new TextField("contents", cont,Field.Store.YES));document.add(new TextField("path", docPath, Field.Store.YES));document.add(new StringField("indexDate",DateTools.dateToString(new Date(), DateTools.Resolution.DAY),Field.Store.YES));return document;}

  

 同时修改for循环中的读取文件

if(files[i].getName().endsWith(".doc")){
doc = getDocument2003(files[i]);
}else if(files[i].getName().endsWith(".docx")){
doc = getDocument2007(files[i]);
}

转载于:https://www.cnblogs.com/zzlp/p/4757568.html

lucene解决全文检索word2003,word2007的办法相关推荐

  1. Apache Lucene与Lucene.Net——全文检索服务器

    lucene学习教程 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一 ...

  2. Lucene(全文检索)入门

    1.搜索技术理论基础 1.1. 搜索引擎的发展历史 l萌芽:Archie.Gopher l起步:Robot(网络机器人)的出现与spider(网络爬虫) l发展:excite.galaxy.yahoo ...

  3. lucene教程--全文检索技术详解

    一 什么是全文检索 1.1 全文检索概念 全文检索是一种将文件中所有文本与检索项匹配的检索方法.它可以根据需要获得全文中有关章.节.段.句.词等信息.计算机程序通过扫描文章中的每一个词,对每一个词建立 ...

  4. 解决eclipse闪退的办法

    2019独角兽企业重金招聘Python工程师标准>>> 解决eclipse闪退的办法 博客分类: 异常 系统安装了两个eclipse,一个是Eclipse sdk3.2,另一个是Ec ...

  5. Apache Lucene Java 全文检索引擎架构

    Apache Lucene Java 全文检索引擎架构 Apache Lucene 8.9.0 已发布,Lucene 是完全用 Java 编写的高性能.功能齐全的全文检索引擎架构,提供了完整的查询引擎 ...

  6. 历史经验之解决vMix22闪退的办法(亲测管用)

    历史经验之解决vMix22闪退的办法(亲测管用) #vMix22闪退# #vmix# 试下面方法: 参考链接:https://blog.csdn.net/weixin_41486034/article ...

  7. 解决塌陷的几种·办法

    <!DOCTYPE html> <html> <head>   <meta charset="UTF-8">   <title ...

  8. 解决开机提示STOP:c0000218办法教程

    "STOP:c0000218 {Registry File Failure}"是一个很典型的错误信息,造成错误的原因是硬盘错误或硬盘损坏.解决办法如下: 1. 从 Windows ...

  9. 显卡温度过高怎么办,解决显卡温度过高办法?

    显卡温度过高怎么办,解决显卡温度过高办法?    众所周知,本本的散热效果不好.有时候显卡温度过高甚至使电脑黑屏,大家都会有这样的疑惑,显卡温度过高怎么办?今天小编为大家整理显卡温度方面的问题,解决大 ...

最新文章

  1. c#中与vb中CType相同功能的函数(强类型转换)
  2. python 网页解析库 beautifulsoup4 简介
  3. python爬虫教程书-Python 爬虫:把廖雪峰教程转换成 PDF 电子书
  4. python画柱状图代码-Python绘制堆叠柱状图的实例
  5. 访问图像中每个像素的值
  6. 14_clickhouse,kafka引擎,kafka消息到ClickHouse的MergeTree引擎
  7. zabbix启动无效,无法监听10051
  8. C#中改变进度条(progressbar)的颜色
  9. 如何使用Amazon Echo控制您的Eero Wi-Fi网络
  10. 1核2G云服务器 标准型S4 S5,腾讯云服务器标准型S4和S5配置性能参数区别及选择攻略...
  11. java爬虫技术的作用_Java网络爬虫怎么实现?
  12. Python实现七段数码管时钟(动态刷新版)
  13. Active Directory Get User's groups using LDAP
  14. 【交易技术前沿】新一代证券交易系统应用架构的研究
  15. java 取消引用_java – 如何取消方法引用谓词
  16. android 图片合成pdf文件,怎样将图片转换成pdf文件时将它们合并成一个pdf文件?...
  17. 黑苹果部分usb、摄像头以及dw1560(BCM94352Z)蓝牙无法识别问题的解决方法
  18. 9、共射放大电路的失真与共射放大电路的阻抗与密勒效应
  19. 小程序源码:收款码三合一制作-多玩法安装简单
  20. 二进制计算机代码,二进制代码是什么???

热门文章

  1. java 调用 ictclas50_1-Ictclas50分词系统ForJava
  2. mysql dese_MySQL 5.6-类似于DENSE_RANK的功能,无需订购
  3. mq服务器与客户端消息同步,使用 ActiveMQ 实现JMS 异步调用
  4. 第六章 计算机网络与i教案,大学计算机基础教案第6章计算机网络基础与应用.docx...
  5. 力扣面试题 01.08. 零矩阵
  6. 做自适应网站专业乐云seo_自适应网站方案品牌乐云seo
  7. 【草稿】windows + vscode 远程开发
  8. java uuid静态方法_Java UUID timestamp()方法与示例
  9. Java SecurityManager checkListen()方法与示例
  10. ffplay分析 (seek操作处理)