【目的】
Lucene在读取非txt文档时将无法正常建立索引.因为非txt文档一般其内容为二进制的.
通过Tika可以将非txt文档内容进行解析并提取到相关的文档内容.
【概述】
Tika是Apache公司在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 }