Hello,
I am having problems using lucene 1.9.1. I was using 1.4.3 successfully, and
tried upgrading to 1.9.1. As I changed my source code so I would no longer be
invocating deprecated methods, the application no longer worked properly, i.e.
the IndexModifier was no longer storing documents. Here is my source code:
-------------------------------------------------------------------------------------------------------
package org.cesar.trulog.search.api;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexModifier;
public class UserIndexer {
public static final String ID = "userId";
public static final String KEYWORDS = "searchKeywords";
public static final String USERNAME = "searchUsername";
private final File index;
private final Analyzer analyzer;
private IndexModifier modifier;
public UserIndexer(final Analyzer analyzer, final String dir) throws
IOException {
index = new File(dir);
this.analyzer = analyzer;
synchronized(UserIndexer.class) {
if (!index.exists()) {
index.mkdirs();
}
}
this.modifier = new IndexModifier(this.index, this.analyzer, true);
}
public UserIndexer(final String dir) throws IOException {
this(new StandardAnalyzer(), dir);
}
private Document getDocument(final SearchItem searchItem) {
Document doc = new Document();
doc.add(new Field(ID, ((Integer)
searchItem.getValue(SearchItemField.ID)).toString(), Field.Store.YES,
Field.Index.UN_TOKENIZED));
doc.add(new Field(KEYWORDS, (String)
searchItem.getValue(SearchItemField.KEYWORD), Field.Store.YES,
Field.Index.TOKENIZED));
doc.add(new Field(USERNAME, (String)
searchItem.getValue(SearchItemField.NAME), Field.Store.YES,
Field.Index.TOKENIZED));
return doc;
}
public synchronized void add(final SearchItem searchItem) throws IOException {
modifier.deleteDocuments(new Term(ID, ((Integer)
searchItem.getValue(SearchItemField.ID)).toString()));
Document doc = this.getDocument(searchItem);
modifier.addDocument(doc);
modifier.flush();
System.out.println(modifier.docCount() + " docs in index");
modifier.close();
}
}
-------------------------------------------------------------------------------------------------------
SearchItem is a custom class that has the data to be used by lucene. The
relevant method in there is
void add(final SearchItem searchItem)
which calls lucene's 'addDocument' method. It used to work back when I was
using Field.Keyword, Field.Text and modifier.delete --- but all these got
deprecated, so.... Here's what happens: no matter how many documents I add, all
I get is '1 docs in index'. If I DON'T close the modifier, I get the right
results 2, 3, 4 docs in index etc --- but if the application is restarted, the
docs are lost, i.e. a search that should return 2 or 3 results returns no
result at all.
Any ideas where to start? What to fix? If I should go back using the deprecated
methods? I tried using FSDirectory instead of File, didn't work. I tried not
deleting the documents before adding them, it didn't work. I tried using a
custom analyzer, it didn't work. I'm running out of ideas.
Thank you very much for your attention,
Rodrigo