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

本文共 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

你可能感兴趣的文章
mysql(待整理)
查看>>
使用PullToRefresh实现下拉刷新和上拉加载
查看>>
mysql
查看>>
2012年电信业八大发展趋势
查看>>
Web日志安全分析工具 v2.0发布
查看>>
JS重载
查看>>
python2和python3同安装在Windows上,切换问题
查看>>
php加速工具xcache的安装与使用(基于LNMP环境)
查看>>
android超链接
查看>>
redhat tomcat
查看>>
统计数据库大小
查看>>
IO流的学习--文件夹下文件的复制
查看>>
第十六章:脚本化HTTP
查看>>
EXCEL表中如何让数值变成万元或亿元
查看>>
nginx在响应request header时候带下划线的需要开启的选项
查看>>
Linux下DHCP服务器配置
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
我的IDEA配置
查看>>
myeclipse显示行号
查看>>
编写高性能的java程序
查看>>