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     }

猜你喜欢

转载自www.cnblogs.com/zhzcode/p/9883992.html