/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.apache.lucene.search; import java.io.IOException; /** * * @author Guest */ public class LanguageModelScorer extends Scorer{ private final float colLen; private static final float DEFAULT_SMOOTHING = 0.15f; private final float smooth; private final byte[] norms; private final Similarity similarity; private final LanguageModelQuery.PostingsAndFreq[] postings; private int docID; private boolean firstTime = true; public LanguageModelScorer(Weight weight, LanguageModelQuery.PostingsAndFreq[] postings, float colLen, Similarity similarity, byte[] norms) { this(weight, postings, colLen, similarity, norms, DEFAULT_SMOOTHING); } public LanguageModelScorer(Weight weight, LanguageModelQuery.PostingsAndFreq[] postings, float colLen, Similarity similarity, byte[] norms, float smooth) { super(weight); this.colLen = colLen; this.postings = postings; this.norms = norms; this.similarity = similarity; this.smooth = smooth; } @Override public float score() throws IOException { float score = 1.0f; for(LanguageModelQuery.PostingsAndFreq pf : postings) { float docLen = similarity.decodeNormValue(norms[docID]); float docFreq = 0; float colFreq = pf.colFreq; if (pf.postings != null && pf.postings.docID() == docID) { docFreq = pf.postings.freq(); } score*=((docLen*docFreq)/((docLen+smooth)*docLen))+((smooth*colFreq)/((docLen+smooth)*colLen)); } return score; } @Override public int docID() { return docID; } public void init() throws IOException { for(LanguageModelQuery.PostingsAndFreq pf : postings) { if (pf.postings != null && pf.postings.docID()!= NO_MORE_DOCS) pf.postings.nextDoc(); } } @Override public int nextDoc() throws IOException { int min = NO_MORE_DOCS; if (firstTime) { docID=-1; init(); firstTime=false; } if (docID == NO_MORE_DOCS) return docID; for(LanguageModelQuery.PostingsAndFreq pf : postings) { if(pf.postings != null && docID >= 0 && pf.postings.docID() == docID) pf.postings.nextDoc(); if(pf.postings != null && pf.postings.docID() != NO_MORE_DOCS && (pf.postings.docID()<min || min == NO_MORE_DOCS)) min = pf.postings.docID(); } docID = min; return min; } @Override public int advance(int target) throws IOException { int min = NO_MORE_DOCS; for(LanguageModelQuery.PostingsAndFreq pf : postings) { int docID = pf.postings.docID(); if(pf.postings != null && docID >= 0 && docID != NO_MORE_DOCS && docID < target) docID = pf.postings.advance(target); if(docID < min) min = docID; } docID = min; return min; } }