добавление документов в существующий индекс в lucene - PullRequest
3 голосов
/ 27 октября 2010

Я хотел бы спросить, как добавить новые документы в существующую lucene индекс. в приведенном ниже исходном коде я просто изменяю параметр IndexWriter на false.

IndexWriter indexWriter = new IndexWriter(
            FSDirectory.open(indexDir),
            new SimpleAnalyzer(),
            false,
            IndexWriter.MaxFieldLength.LIMITED);

потому что false означает, что индекс все еще будет открытым, а не закрытым. также, чтобы добавить новый документ, я должен использовать

indexWriter.addDocument(doc)

но у меня вопрос, как именно я могу добавить новые документы в существующий индекс Lucene. Я немного растерялся, узнав, куда поместить новый каталог путей, содержащий новые документы, в класс lucene, чтобы lucene мог индексировать эти новые документы и добавлять его в существующие индексы. любая помощь будет оценена, хотя. спасибо.

import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class testlucene1 {
public static void main(String[] args) throws Exception {
    File indexDir = new File("C:/Users/Raden/Documents/lucene/LuceneHibernate/adi");
    File dataDir = new File("C:/Users/Raden/Documents/lucene/LuceneHibernate/adi");
    String suffix = "txt";
    testlucene1 indexer = new testlucene1();
    int numIndex = indexer.index(indexDir, dataDir, suffix);
    System.out.println("Total files indexed " + numIndex);
}

private int index(File indexDir, File dataDir, String suffix) throws Exception {
    IndexWriter indexWriter = new IndexWriter(
            FSDirectory.open(indexDir),
            new SimpleAnalyzer(),
            false,
            IndexWriter.MaxFieldLength.LIMITED);
    indexWriter.setUseCompoundFile(false);
    indexDirectory(indexWriter, dataDir, suffix);
    int numIndexed = indexWriter.maxDoc();
    indexWriter.optimize();
    indexWriter.close();
    return numIndexed;
}

   private void indexDirectory(IndexWriter indexWriter, File dataDir, String suffix)    throws IOException {
    File[] files = dataDir.listFiles();
    for (int i = 0; i < files.length; i++) {
        File f = files[i];
        if (f.isDirectory()) {
            indexDirectory(indexWriter, f, suffix);
        } else {
            indexFileWithIndexWriter(indexWriter, f, suffix);
        }
    }
}

private void indexFileWithIndexWriter(IndexWriter indexWriter, File f, String suffix) throws IOException {
    if (f.isHidden() || f.isDirectory() || !f.canRead() || !f.exists()) {
        return;
    }
    if (suffix != null && !f.getName().endsWith(suffix)) {
        return;
    }
    System.out.println("Indexing file " + f.getCanonicalPath());
    Document doc = new Document();
    doc.add(new Field("contents", new FileReader(f)));
    doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES,  Field.Index.ANALYZED));
    indexWriter.addDocument(doc);
}
} 

Ответы [ 3 ]

2 голосов
/ 28 октября 2010

также для добавления нового документа, который я должен использовать .... но мой вопрос в том, как именно я могу добавить новые документы в существующий индекс lucene

. Вы можете уточнить, что вы имеете в виду?Вы знаете, как добавить документы в индекс, как вы заявили, но затем вы спросите, как ... добавить новые документы?

1 голос
/ 10 февраля 2017

Основываясь на Lucene API, при создании IndexWriter конструктор позволяет указать IndexWriterConfig.

IndexWriter(Directory d, IndexWriterConfig conf)

IndexWriterConfig позволяет указать режим открытия:

IndexWriterConfig conf = new IndexWriterConfig(analyzer);
conf.setOpenMode(IndexWriterConfig.OpenMode.APPEND);

И у вас есть 3 варианта:

  • IndexWriterConfig.OpenMode.APPEND
  • IndexWriterConfig.OpenMode.CREATE
  • IndexWriterConfig.OpenMode.CREATE_OR_APPEND
1 голос
/ 27 октября 2010

Когда вы создаете новый IndexWriter, вы не создадите новый индекс (если вы явно не скажете lucene принудительно создать новый). Таким образом, ваш код будет работать независимо от того, существует ли индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...