zoukankan      html  css  js  c++  java
  • Tika

    【目的】

    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 block
    13             e.printStackTrace();
    14         } catch (TikaException e) {
    15             // TODO Auto-generated catch block
    16             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             //创建Writer
    10             writer = util.getWriter(this.getDirectory(path), this.getConfig());
    11             
    12             //创建Document
    13             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     }
  • 相关阅读:
    【原】基础篇:第一篇,本节主要向大家介绍Ext的最基础的话题
    【原】基础篇:第七篇,Ext组件系列之label组件的基本用法
    【原】基础篇:第三篇,常用的一些Ext方法
    框架
    【原】基础篇:第六篇,Ext组件系列之button组件的基本用法
    序列化
    【原】基础篇:第四篇,Ext中有两个很重要的方法,一个是decode;一个是encode.
    Arrays.asList详解
    JSP页面导出CSV查询结果
    Log的重要性
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9883992.html
Copyright © 2011-2022 走看看