package doser.entitydisambiguation.knowledgebases;
import java.io.File;
import java.io.IOException;
import java.util.TimerTask;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.search.similarities.DefaultSimilarity;
import org.apache.lucene.search.similarities.Similarity;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Each knowledge base provides its own class with its respective properties.
* These are the knowledge base index uri. IndexSearcher, IndexReader objects
* and the dynamic property.
*
* @author stefan zwicklbauer
*/
public abstract class AbstractKnowledgeBase extends TimerTask {
private final static Logger logger = LoggerFactory.getLogger(AbstractKnowledgeBase.class);
private String indexUri;
private boolean dynamic;
private SearcherManager manager;
private IndexSearcher searcher;
AbstractKnowledgeBase(String uri, boolean dynamic) {
this(uri, dynamic, new DefaultSimilarity());
}
AbstractKnowledgeBase(String uri, boolean dynamic, Similarity sim) {
super();
this.indexUri = uri;
this.dynamic = dynamic;
File indexDir = new File(indexUri);
Directory dir;
try {
dir = FSDirectory.open(indexDir);
this.manager = new SearcherManager(dir, new SearcherFactory());
} catch (IOException e) {
logger.error("IOException in "+AbstractKnowledgeBase.class.getName(), e);
}
}
public String getIndexUri() {
return indexUri;
}
public IndexSearcher getSearcher() {
try {
this.searcher = manager.acquire();
} catch (IOException e) {
logger.error("IOException in "+AbstractKnowledgeBase.class.getName(), e);
}
return this.searcher;
}
public void release() {
try {
manager.release(searcher);
} catch (IOException e) {
logger.error("IOException in "+AbstractKnowledgeBase.class.getName(), e);
}
}
/**
* Periodically reopens the Indexreader, if and only if this is an dynamic
* knowledge base. The changed knowledge base will be live within a few moments.
*/
@Override
public void run() {
if (dynamic) {
try {
manager.maybeRefresh();
} catch (IOException e) {
logger.error("IOException in "+AbstractKnowledgeBase.class.getName(), e);
}
}
}
public abstract void initialize();
}