0

我使用 Tika 编写了(主要从 lucene-in-action 电子书中复制)一个索引示例。但它根本不索引文档。编译或运行没有错误。我尝试索引 .pdf、.ppt、.doc 甚至 .txt 文档,没有用,在搜索返回 0 次点击时,我注意了文档中的单词。请看一下代码:

public class TikaIndexer extends Indexer {

private boolean DEBUG = false; 
static Set textualMetadataFields = new HashSet(); 
static { 
    textualMetadataFields.add(Metadata.TITLE); 
    textualMetadataFields.add(Metadata.AUTHOR); 
    textualMetadataFields.add(Metadata.COMMENTS); 
    textualMetadataFields.add(Metadata.KEYWORDS); 
    textualMetadataFields.add(Metadata.DESCRIPTION); 
    textualMetadataFields.add(Metadata.SUBJECT); 
}


public TikaIndexer(String indexDir) throws IOException {
    super(indexDir);
}


@Override
protected boolean acceptFile(File f) {
    return true; 
}

@Override
protected Document getDocument(File f) throws Exception {
    Metadata metadata = new Metadata();

    metadata.set(Metadata.RESOURCE_NAME_KEY, 
            f.getCanonicalPath());

    InputStream is = new FileInputStream(f);
    Parser parser = new AutoDetectParser();
    ContentHandler handler = new BodyContentHandler(10*1024*1024);
    try {
        parser.parse(is, handler, metadata, new ParseContext());
    } finally {
        is.close();
    }
    Document doc = new Document();
    doc.add(new Field("contents", handler.toString(), Field.Store.NO, Field.Index.ANALYZED));
    if (DEBUG) {
        System.out.println(" intregul textt: " + handler.toString());
    }
    for (String name : metadata.names()) { 
        String value = metadata.get(name);
        if (textualMetadataFields.contains(name)) {
            doc.add(new Field("contents", value, 
                    Field.Store.NO, Field.Index.ANALYZED));
        }
        doc.add(new Field(name, value, Field.Store.YES, Field.Index.NO));
        if (DEBUG) {
            System.out.println(" " + name + ": " + value);
        }
    }
    if (DEBUG) {
        System.out.println();
    }
    return doc;
 }
}

主要课程:

public static void main(String args[])
{
    String indexDir = "src/indexDirectory";
    String dataDir = "src/filesDirectory";
      try 
            {
                TikaConfig config = TikaConfig.getDefaultConfig();
                List<MediaType> parsers = new ArrayList(config.getParser().getSupportedTypes(new ParseContext())); //3
                Collections.sort(parsers);
                Iterator<MediaType> it = parsers.iterator();
                System.out.println(parsers.size());
                System.out.println("Tipuri de parsere:");
                while (it.hasNext()) {
                    System.out.println(" " + it.next());
                }

                System.out.println();

                long start = new Date().getTime();
                TikaIndexer indexer = new TikaIndexer(indexDir);
                int numIndexed = indexer.index(dataDir);

                long end = new Date().getTime();
                System.out.println("Indexarea a " + numIndexed + " fisiere a durat "
                        + (end - start) + " milisecunde.");
                System.out.println();
                System.out.println("--------------------------------------------------------------");
                System.out.println();
            } 
            catch (Exception ex) 
            {
                System.out.println("Nu s-a putut realiza indexarea: ");
                ex.printStackTrace();
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
 }
4

0 回答 0