2012-05-05 11 views
12

Sono nuovo di Java e di Lucene. Il mio codice ottiene una riga da un file e lo memorizza in Lucene Index. Ma quando creo un IndexReader per cercare e leggere dall'indice, viene generata un'eccezione.org.apache.lucene.index.IndexNotFoundException: nessun segmento * file trovato in org.apache.lucene.store.RAMDirectory

Il mio codice java è sotto. Sulla creazione del IndexReader viene generata IndexNotFoundException

static String itemsfreq[]; 
static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35); 
static IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer); 

public static void index_data(Directory indexed_document,int doc_num,IndexWriter w) throws IOException 
    { 
    for(int i = 0;i < itemsfreq.length;i++) 
     { 
     Document doc = new Document(); 
     doc.add(new Field(Integer.toString(doc_num)+","+itemsfreq[i],itemsfreq[i++], Field.Store.YES, Field.Index.ANALYZED)); 
     w.addDocument(doc); 
     } 
    } 
//Gets string from a file and insert it in INDEX named indexed_document 
public static void main(String[] args) throws IOException 
    { 
    BufferedReader reader = new BufferedReader(new FileReader("fullText100.txt")); 
    String line; 
    int i = 0; 
    Directory indexed_document = new RAMDirectory(); 
    IndexWriter writer = new IndexWriter(indexed_document, config); 
    while((line=reader.readLine()) != null) 
     { 
     if(i == 1) 
      { 
      break; 
      } 
     itemsfreq = line.split(" "); 
     index_data(indexed_document,i,writer); 
     i++; 
     } 

    IndexReader r = IndexReader.open(indexed_document); 
    } 

risposta

14

Per scrivere le modifiche al indice si deve chiudere lo scrittore indice e quindi aprire l'IndexReader.

writer.close(); 

Se si deve aprire l'IndexReader prima di scrivere è completato, si deve dire al IndexReader di riaprire l'indice al fine di vedere i cambiamenti.

+0

ho applicato questa soluzione e ha funzionato. –

16

prima di aprire l'indice utilizzando un lettore, chiamare una volta writer.commit()

+1

Stavo affrontando un problema simile e l'uso di 'writer.commit()' lo risolveva. Se avessi usato 'writer.close()', dovrei riaprire lo scrittore di nuovo. Il tuo suggerimento è migliore del precedente. – tuxdna

+2

In effetti, questa è la soluzione giusta in quanto è raccomandato da Lucene docs di riutilizzare le singole istanze di IndexWriter e IndexReader; In questo modo non sono obbligato a chiudere lo scrittore e crearlo nuovamente quando necessario. – Serg

3

Hai bisogno di fare è quello di chiamare esplicitamente impegnarsi prima di aprire l'IndexSearcher.

directory = new RAMDirectory(); 
    iwriter = new IndexWriter(directory, config); 
    iwriter.commit(); 

ora aperto Ricercatore

ireader = DirectoryReader.open(directory); 
isearcher = new IndexSearcher(ireader); 

Ricorda inoltre è necessario chiamare commit dopo l'aggiunta di documenti altrimenti ricerca potrebbe non trovarlo. Il ricercatore deve riaprirsi dopo il commit (ovviamente chiudi il vecchio cercatore).

iwriter.commit(); 
0

ho ottenuto questo errore (in Lucene.Net, C#) perché avevo creato un indice con la creazione di directory appropriata sul mio filesystem e FSDirectory in memoria, ma non aveva in realtà ancora aggiunto nessun documento.

In particolare, il codice per aggiungere nuovi documenti stava controllando per assicurarsi che non fosse l'aggiunta di un duplicato con un lettore, ma l'eccezione è stata generata quando si cercava di aggiungere il primo documento, perché non c'erano ancora segmenti.

mi sono occupato di questo in questo modo:

// Make a reader to check the index for duplicates 
// The reader will only be aware of items that were in the index before it was created 
IndexReader reader = null; 
try { 
    reader = IndexReader.Open(index, true); 
} catch(IOException) { 
    // There is no segments file because the index is empty 
    reader = null; 
} 

... // inside a method called by that scope, with reader passed in 

// See if it exists already 
// If the reader is null, then the index is empty 
if(reader != null) { 
    var existsTerm = new Term(SingleFieldIndexManager.FieldName, formattedTerm); 
    var matches = reader.TermDocs(existsTerm); 
    if(matches.Next()) { 
     // It's already in there, no need to add again 
     return; 
    } 
} 

... // back to the first method after a return 

// dispose of the reader if we managed to create one 
if(reader != null) { 
    reader.Dispose(); 
} 
+0

Ehi, ho lo stesso problema di te. Ma non capisco come l'hai risolto. Se non ci sono file, allora entra nel blocco catch e questo è tutto, giusto? – Valentin

+0

Trovato il problema. Ho ricevuto questo errore durante la creazione di IndexWriter con parametro create = false – Valentin

Problemi correlati