博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tika
阅读量:5931 次
发布时间:2019-06-19

本文共 4977 字,大约阅读时间需要 16 分钟。

【目的】

Lucene在读取非txt文档时将无法正常建立索引.因为非txt文档一般其内容为二进制的.

通过Tika可以将非txt文档内容进行解析并提取到相关的文档内容.

 

【概述】

 

TikaApache公司在2008年推出一个项目,目的是为了在Lucene和其他格式的文件之间建立一个桥梁.通过Tika可以解析到非文本文件的内容.

 

【方式一】

 

/**     * 读取文件内容     * @param file     */    public void read(File file){        //AutoDetecParser:自动检测符合文件的Parser并进行返回        Parser parser = new AutoDetectParser();        InputStream stream = null;        try {            //创建输入流对象            stream = new FileInputStream(file);            //内容的存放对象            BodyContentHandler handler = new BodyContentHandler();            //定义元数据存放对象            Metadata metaData = new Metadata();            //增加元数据的信息            metaData.add(metaData.RESOURCE_NAME_KEY, file.getName());                        //创建ParseContext对象            //通过对象存储相关的变量信息            ParseContext context = new ParseContext();                        //参数1    :输入流对象(转换内容的对象)            //参数2    :内容的存放对象            //参数3    :元数据存放对象            //参数4    :上下文对象            parser.parse(stream,handler, metaData,context );                        //输出文件的内容            System.out.println(handler);                        //输出元数据信息                        for(String temp : metaData.names()){                System.out.println(temp + " = " + metaData.get(temp));            }                    } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SAXException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (TikaException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        finally{            try {                stream.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }

 

1     /** 2      * 测试Tika读取文件内容 3      */ 4     @Test 5     public void testTika(){ 6         TikaUtil util = new TikaUtil(); 7         //util.read(new File("E:\\lucene\\files3\\story2.docx")); 8         //util.read(new File("E:\\lucene\\files3\\Linux20个常用命令.pdf")); 9         util.read(new File("E:\\lucene\\files3\\学员末班申请表 - 模板.xls"));10         System.out.println("内容读取完成");11     }

 

【方式二】

1     /** 2      * 读取文件内容 3      * @param file 4      */ 5     public void read2(File file){ 6         Tika tika = new Tika(); 7          8         try { 9             String content = tika.parseToString(file);10             System.out.println(content);11         } catch (IOException e) {        12             // TODO Auto-generated catch block13             e.printStackTrace();14         } catch (TikaException e) {15             // TODO Auto-generated catch block16             e.printStackTrace();17         }18     }

注意:方式2的执行效率低于方式1

 

【Tika创建索引】

 

1     /** 2      * 为指定路径下的文件创建索引 3      * @param filePath 4      */ 5     public  void createIndex( String filePath){ 6         IndexWriter writer = null; 7          8         try{ 9             //创建Writer10             writer = util.getWriter(this.getDirectory(path), this.getConfig());11             12             //创建Document13             Document doc = null;14             15             //获取文件列表16             File list = new File(filePath);17             Tika tika = new Tika();18             19             //创建索引20             int i = 0;21             for(File file : list.listFiles()){22                 doc = new Document();23                 //建立Id列24                 doc.add(new Field("id",String.valueOf(i++),Field.Store.YES,Field.Index.NOT_ANALYZED));25                 doc.add(new Field("filename",file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));26                 doc.add(new Field("modifydate",Long.toString(file.lastModified()),Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS ));27                 //doc.add(new Field("size",getSize(file.length()),Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));28                 29                 doc.add(new NumericField("size",Field.Store.YES,true).setLongValue(getSize(file.length())));30                 doc.add(new NumericField("score2",Field.Store.YES,true).setDoubleValue(Math.random()));31                 doc.add(new Field("path",file.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));32                 //doc.add(new Field("content",new FileReader(file)));33                 //使用Tika读取文件内容并建立分词34                 doc.add(new Field("content",new StringReader(tika.parseToString(file))));35                 36                 writer.addDocument(doc);37             }38         }39         catch(Exception ex){40             ex.printStackTrace();41         }42         finally{43             try {44                 writer.close();45             } catch (CorruptIndexException e) {46                 e.printStackTrace();47             } catch (IOException e) {48                 e.printStackTrace();49             }50         }51     }

 

转载于:https://www.cnblogs.com/zhzcode/p/9883992.html

你可能感兴趣的文章
protocol buffers生成go代码原理
查看>>
rfc 5280 X.509 PKI 解析
查看>>
实现简单的FTP多线程下载和上传
查看>>
关于表单和后台交互
查看>>
四则运算第二篇
查看>>
三大范式
查看>>
(转)经济学中的风险和不确定性的区别是什么?
查看>>
《代码敲不队》第八次团队作业:Alpha冲刺 第四天
查看>>
Date18
查看>>
js 事件循环机制 EventLoop
查看>>
iOS 消息推送机制
查看>>
TFS配置(二)
查看>>
工作中用不到的技术要不要学?
查看>>
zabbix监控添加主机,报警、监控的设置
查看>>
从浏览器打开网址到请求到网页内容超细原理过程详解(免费)
查看>>
我的友情链接
查看>>
WebSphere中jsp缓存清理的方法
查看>>
⑧⑨正确的选择比一味的努力更重要
查看>>
RHEL Linux6.3下的vnc安装和多用户配置
查看>>
iOS网络编程-iOS中解析Bonjour服务
查看>>