@Override public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores, float boost) throws IOException { final TermContext context; final IndexReaderContext topContext = searcher.getTopReaderContext(); if (termContext == null || termContext.wasBuiltFor(topContext) == false) { context = TermContext.build(topContext, term); } else { context = termContext; } return new SpanTermWeight(context, searcher, needsScores ? Collections.singletonMap(term, context) : null, boost); }
@Override public Spans getSpans(final LeafReaderContext context, Postings requiredPostings) throws IOException { assert termContext.wasBuiltFor(ReaderUtil.getTopLevelContext(context)) : "The top-reader used to create Weight is not the same as the current reader's top-reader (" + ReaderUtil.getTopLevelContext(context); final TermState state = termContext.get(context.ord); if (state == null) { // term is not present in that reader assert context.reader().docFreq(term) == 0 : "no termstate found but term exists in reader term=" + term; return null; } final Terms terms = context.reader().terms(term.field()); if (terms == null) return null; if (terms.hasPositions() == false) throw new IllegalStateException("field \"" + term.field() + "\" was indexed without position data; cannot run SpanTermQuery (term=" + term.text() + ")"); final TermsEnum termsEnum = terms.iterator(); termsEnum.seekExact(term.bytes(), state); final PostingsEnum postings = termsEnum.postings(null, requiredPostings.getRequiredPostings()); float positionsCost = termPositionsCost(termsEnum) * PHRASE_TO_SPAN_TERM_POSITIONS_COST; return new TermSpans(getSimScorer(context), postings, term, positionsCost); } }
@Override public BLSpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException { final TermContext context; final IndexReaderContext topContext = searcher.getTopReaderContext(); if (termContext == null || termContext.topReaderContext != topContext) { context = TermContext.build(topContext, query.getTerm()); } else { context = termContext; } Map<Term, TermContext> contexts = needsScores ? Collections.singletonMap(query.getTerm(), context) : null; final SpanTermWeight weight = query.new SpanTermWeight(context, searcher, contexts); return new BLSpanWeight(this, searcher, contexts) { @Override public void extractTermContexts(Map<Term, TermContext> contexts) { weight.extractTermContexts(contexts); } @Override public BLSpans getSpans(LeafReaderContext ctx, Postings requiredPostings) throws IOException { Spans spans = weight.getSpans(ctx, requiredPostings); return spans == null ? null : new BLSpansWrapper(spans); } @Override public void extractTerms(Set<Term> terms) { weight.extractTerms(terms); } }; }
@Override public Spans getSpans(final LeafReaderContext context, Postings requiredPostings) throws IOException { assert termContext.topReaderContext == ReaderUtil.getTopLevelContext(context) : "The top-reader used to create Weight (" + termContext.topReaderContext + ") is not the same as the current reader's top-reader (" + ReaderUtil.getTopLevelContext(context); final TermState state = termContext.get(context.ord); if (state == null) { // term is not present in that reader assert context.reader().docFreq(term) == 0 : "no termstate found but term exists in reader term=" + term; return null; } final Terms terms = context.reader().terms(term.field()); if (terms == null) return null; if (terms.hasPositions() == false) throw new IllegalStateException("field \"" + term.field() + "\" was indexed without position data; cannot run SpanTermQuery (term=" + term.text() + ")"); final TermsEnum termsEnum = terms.iterator(); termsEnum.seekExact(term.bytes(), state); final PostingsEnum postings = termsEnum.postings(null, requiredPostings.getRequiredPostings()); float positionsCost = termPositionsCost(termsEnum) * PHRASE_TO_SPAN_TERM_POSITIONS_COST; return new TermSpans(getSimScorer(context), postings, term, positionsCost); } }
@Override public Spans getSpans(final LeafReaderContext context, Postings requiredPostings) throws IOException { assert termContext.wasBuiltFor(ReaderUtil.getTopLevelContext(context)) : "The top-reader used to create Weight is not the same as the current reader's top-reader (" + ReaderUtil.getTopLevelContext(context); final TermState state = termContext.get(context.ord); if (state == null) { // term is not present in that reader assert context.reader().docFreq(term) == 0 : "no termstate found but term exists in reader term=" + term; return null; } final Terms terms = context.reader().terms(term.field()); if (terms == null) return null; if (terms.hasPositions() == false) throw new IllegalStateException("field \"" + term.field() + "\" was indexed without position data; cannot run SpanTermQuery (term=" + term.text() + ")"); final TermsEnum termsEnum = terms.iterator(); termsEnum.seekExact(term.bytes(), state); final PostingsEnum postings = termsEnum.postings(null, requiredPostings.getRequiredPostings()); float positionsCost = termPositionsCost(termsEnum) * PHRASE_TO_SPAN_TERM_POSITIONS_COST; return new TermSpans(getSimScorer(context), postings, term, positionsCost); } }
@Override public Spans getSpans(final LeafReaderContext context, Postings requiredPostings) throws IOException { assert termContext.wasBuiltFor(ReaderUtil.getTopLevelContext(context)) : "The top-reader used to create Weight is not the same as the current reader's top-reader (" + ReaderUtil.getTopLevelContext(context); final TermState state = termContext.get(context.ord); if (state == null) { // term is not present in that reader assert context.reader().docFreq(term) == 0 : "no termstate found but term exists in reader term=" + term; return null; } final Terms terms = context.reader().terms(term.field()); if (terms == null) return null; if (terms.hasPositions() == false) throw new IllegalStateException("field \"" + term.field() + "\" was indexed without position data; cannot run SpanTermQuery (term=" + term.text() + ")"); final TermsEnum termsEnum = terms.iterator(); termsEnum.seekExact(term.bytes(), state); final PostingsEnum postings = termsEnum.postings(null, requiredPostings.getRequiredPostings()); float positionsCost = termPositionsCost(termsEnum) * PHRASE_TO_SPAN_TERM_POSITIONS_COST; return new TermSpans(getSimScorer(context), postings, term, positionsCost); } }
@Override public void extractTermContexts(Map<Term, TermContext> contexts) { weight.extractTermContexts(contexts); }
@Override public BLSpans getSpans(LeafReaderContext ctx, Postings requiredPostings) throws IOException { Spans spans = weight.getSpans(ctx, requiredPostings); return spans == null ? null : new BLSpansWrapper(spans); }
@Override public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException { final TermContext context; final IndexReaderContext topContext = searcher.getTopReaderContext(); if (termContext == null || termContext.topReaderContext != topContext) { context = TermContext.build(topContext, term); } else { context = termContext; } return new SpanTermWeight(context, searcher, needsScores ? Collections.singletonMap(term, context) : null); }
@Override public PayloadTermSpanScorer scorer(LeafReaderContext context) throws IOException { Spans spans = super.getSpans(context, Postings.PAYLOADS); if (spans == null) { return null; } Similarity.SimScorer simScorer = getSimScorer(context); PayloadSpans payloadSpans = new PayloadSpans(spans, simScorer); return new PayloadTermSpanScorer(payloadSpans, this, simScorer); }
@Override public void extractTerms(Set<Term> terms) { weight.extractTerms(terms); } };
@Override public PayloadTermSpanScorer scorer(LeafReaderContext context) throws IOException { Spans spans = super.getSpans(context, Postings.PAYLOADS); if (spans == null) { return null; } Similarity.SimScorer simScorer = getSimScorer(context); PayloadSpans payloadSpans = new PayloadSpans(spans, simScorer); return new PayloadTermSpanScorer(payloadSpans, this, simScorer); }
@Override public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores, float boost) throws IOException { final TermContext context; final IndexReaderContext topContext = searcher.getTopReaderContext(); if (termContext == null || termContext.wasBuiltFor(topContext) == false) { context = TermContext.build(topContext, term); } else { context = termContext; } return new SpanTermWeight(context, searcher, needsScores ? Collections.singletonMap(term, context) : null, boost); }
@Override public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException { final TermContext context; final IndexReaderContext topContext = searcher.getTopReaderContext(); if (termContext == null || termContext.wasBuiltFor(topContext) == false) { context = TermContext.build(topContext, term); } else { context = termContext; } return new SpanTermWeight(context, searcher, needsScores ? Collections.singletonMap(term, context) : null); }