Lucene4.10使用教程(九):Tika
阿新 • • 發佈:2019-02-14
package com.johnny.lucene05.lucene_plugin.tika;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.DoubleField;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.tika.Tika;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.junit.Test;
import org.xml.sax.ContentHandler;
public class TikaTest {
/**使用Tika解析檔案,並將其中的文字提取出來
*
* 注意:圖片是無法解析的
* **/
@Test
public void fileToTxt() throws Exception {
//使用AutoDetectParser可以使用Tika根據實際情況自動轉換需要使用的parser,不需要再手工指定
Parser tikaParser = new AutoDetectParser();
File file = new File("/Users/ChinaMWorld/Desktop/WorkSpace/Johnny/lucene/lucene/src/main/java/resources/lucene05/SDK介面專案部署文件.docx");
InputStream is = new FileInputStream(file);
/*/
* 引數的含義為:
* inputStream:檔案輸入流
* ContentHandler:所有解析出來的內容會放到它的子類BodyContentHandler中
* Metadata :Tika解析文件時會生成的一組說明資料
* ParseContext:用來儲存需要填入的引數,最少需要設定tikaParser本身
* **/
ContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
/**設定文件名稱,
* 對於deprecate屬性的內容表示無法通過在metadata中設定進行修改**/
metadata.add(Metadata.RESOURCE_NAME_KEY, file.getName());//可以用來設定文件名稱
ParseContext parseContext = new ParseContext();
parseContext.set(Parser.class, tikaParser);
tikaParser.parse(is, handler, metadata, parseContext);
System.out.println(handler.toString());
System.out.println("---------------------------");
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
}
/**
* 使用Tika的第二種方式進行解析,但是官方文件認為直接使用第二種方案效率不如上面一種效率高
* 如果在tika.parse方法中不放置metadata,那麼可以自己設定的所有metadata都會生效
*/
@Test
public void filetoTxt2() throws Exception{
Tika tika = new Tika();
File file = new File("/Users/ChinaMWorld/Desktop/WorkSpace/Johnny/lucene/lucene/src/main/java/resources/lucene05/SDK介面專案部署文件.docx");
InputStream is = new FileInputStream(file);
Metadata metadata =new Metadata();
metadata.add(Metadata.AUTHOR,"abc");
metadata.add(Metadata.RESOURCE_NAME_KEY, file.getName());
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
String s = tika.parseToString(is,metadata);
System.out.println("---------------------------");
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(s);
}
/**
* 使用Tika生成索引,並查詢結果,
* tika生成索引參見方法:Document com.johnny.lucene05.lucene_plugin.tika.FileIndexUtils.fileToDoc(File file) throws Exception
*/
@Test
public void testTikaToIndex(){
FileIndexUtils.index(true);
FileIndexUtils fu = new FileIndexUtils();
fu.searchByTerm("content", "log4j".toLowerCase());
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.DoubleField;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.tika.Tika;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.junit.Test;
import org.xml.sax.ContentHandler;
public class TikaTest {
/**使用Tika解析檔案,並將其中的文字提取出來
*
* 注意:圖片是無法解析的
* **/
@Test
public void fileToTxt() throws Exception {
//使用AutoDetectParser可以使用Tika根據實際情況自動轉換需要使用的parser,不需要再手工指定
Parser tikaParser = new AutoDetectParser();
File file = new File("/Users/ChinaMWorld/Desktop/WorkSpace/Johnny/lucene/lucene/src/main/java/resources/lucene05/SDK介面專案部署文件.docx");
InputStream is = new FileInputStream(file);
/*/
* 引數的含義為:
* inputStream:檔案輸入流
* ContentHandler:所有解析出來的內容會放到它的子類BodyContentHandler中
* Metadata :Tika解析文件時會生成的一組說明資料
* ParseContext:用來儲存需要填入的引數,最少需要設定tikaParser本身
* **/
ContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
/**設定文件名稱,
* 對於deprecate屬性的內容表示無法通過在metadata中設定進行修改**/
metadata.add(Metadata.RESOURCE_NAME_KEY, file.getName());//可以用來設定文件名稱
ParseContext parseContext = new ParseContext();
parseContext.set(Parser.class, tikaParser);
tikaParser.parse(is, handler, metadata, parseContext);
System.out.println(handler.toString());
System.out.println("---------------------------");
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
}
/**
* 使用Tika的第二種方式進行解析,但是官方文件認為直接使用第二種方案效率不如上面一種效率高
* 如果在tika.parse方法中不放置metadata,那麼可以自己設定的所有metadata都會生效
*/
@Test
public void filetoTxt2() throws Exception{
Tika tika = new Tika();
File file = new File("/Users/ChinaMWorld/Desktop/WorkSpace/Johnny/lucene/lucene/src/main/java/resources/lucene05/SDK介面專案部署文件.docx");
InputStream is = new FileInputStream(file);
Metadata metadata =new Metadata();
metadata.add(Metadata.AUTHOR,"abc");
metadata.add(Metadata.RESOURCE_NAME_KEY, file.getName());
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
String s = tika.parseToString(is,metadata);
System.out.println("---------------------------");
for(String name :metadata.names()){
System.out.println(name+"-->"+metadata.get(name));
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(s);
}
/**
* 使用Tika生成索引,並查詢結果,
* tika生成索引參見方法:Document com.johnny.lucene05.lucene_plugin.tika.FileIndexUtils.fileToDoc(File file) throws Exception
*/
@Test
public void testTikaToIndex(){
FileIndexUtils.index(true);
FileIndexUtils fu = new FileIndexUtils();
fu.searchByTerm("content", "log4j".toLowerCase());
}
}