package doser.lucene.query;
import java.io.IOException;
import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.Weight;
import org.apache.lucene.util.Bits;
import doser.lucene.features.IEntityCentricExtFeatures;
/**
* Due to major performance problems if we use an IndexReader request for every
* single document, we create a <Concept, Occurence> Hashmap to improve the
* overall performance.
*
* Our StartupInformationLoader provides these necessary information much
* faster.
*
* @author Stefan Zwicklbauer
*
*/
public class SensePriorQuery extends Query {
class PriorWeight extends Weight {
class SensePriorScorer extends Scorer {
private final AtomicReaderContext context;
private int lastDoc = -1;
SensePriorScorer(final Weight weight,
final AtomicReaderContext context) {
super(weight);
this.context = context;
}
@Override
public int advance(final int target) throws IOException {
final int maxdoc = context.reader().numDocs();
if (target > (maxdoc - 1)) {
return NO_MORE_DOCS;
}
return lastDoc = target;
}
@Override
public long cost() {
return 0;
}
@Override
public int docID() {
return lastDoc;
}
@Override
public int freq() throws IOException {
return 1;
}
@Override
public int nextDoc() throws IOException {
if ((context.reader().numDocs() - 1) > lastDoc) {
return ++lastDoc;
} else {
return NO_MORE_DOCS;
}
}
@Override
public float score() throws IOException {
float res = 0.0f;
res = kb.getSensePriorOfDocument(keyword, context.docBase
+ lastDoc);
return res;
}
@Override
public String toString() {
return "SensePrior";
}
}
@Override
public Explanation explain(final AtomicReaderContext context,
final int doc) throws IOException {
return null;
}
@Override
public Query getQuery() {
return SensePriorQuery.this;
}
@Override
public float getValueForNormalization() throws IOException {
return 0;
}
@Override
public void normalize(final float norm, final float topLevelBoost) {
// Do nothing here
}
@Override
public Scorer scorer(AtomicReaderContext context, Bits acceptDocs)
throws IOException {
return new SensePriorScorer(this, context);
}
}
private final IEntityCentricExtFeatures kb;
private final String keyword;
public SensePriorQuery(final String keyword, final IEntityCentricExtFeatures kb) {
super();
this.keyword = keyword;
this.kb = kb;
}
@Override
public Weight createWeight(final IndexSearcher searcher) throws IOException {
return new PriorWeight();
}
@Override
public String toString(final String field) {
return "SensePriorQuery";
}
}