/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.lucene.search.suggest.document; import java.io.IOException; import org.apache.lucene.index.LeafReader; import org.apache.lucene.search.BulkScorer; import org.apache.lucene.search.LeafCollector; import org.apache.lucene.util.Bits; import org.apache.lucene.util.automaton.Automaton; /** * Expert: Responsible for executing the query against an * appropriate suggester and collecting the results * via a collector. * * {@link #score(LeafCollector, Bits, int, int)} is called * for each leaf reader. * * {@link #accept(int,Bits)} and {@link #score(float, float)} * is called for every matched completion (i.e. document) * * @lucene.experimental */ public class CompletionScorer extends BulkScorer { private final NRTSuggester suggester; private final Bits filterDocs; // values accessed by suggester /** weight that created this scorer */ protected final CompletionWeight weight; final LeafReader reader; final boolean filtered; final Automaton automaton; /** * Creates a scorer for a field-specific <code>suggester</code> scoped by <code>acceptDocs</code> */ protected CompletionScorer(final CompletionWeight weight, final NRTSuggester suggester, final LeafReader reader, final Bits filterDocs, final boolean filtered, final Automaton automaton) throws IOException { this.weight = weight; this.suggester = suggester; this.reader = reader; this.automaton = automaton; this.filtered = filtered; this.filterDocs = filterDocs; } @Override public int score(LeafCollector collector, Bits acceptDocs, int min, int max) throws IOException { if (!(collector instanceof TopSuggestDocsCollector)) { throw new IllegalArgumentException("collector is not of type TopSuggestDocsCollector"); } suggester.lookup(this, acceptDocs, ((TopSuggestDocsCollector) collector)); return max; } @Override public long cost() { return 0; } /** * Returns true if a document with <code>docID</code> is accepted, * false if the docID maps to a deleted * document or has been filtered out * @param liveDocs the {@link Bits} representing live docs, or possibly * {@code null} if all docs are live */ public final boolean accept(int docID, Bits liveDocs) { return (filterDocs == null || filterDocs.get(docID)) && (liveDocs == null || liveDocs.get(docID)); } /** * Returns the score for a matched completion * based on the query time boost and the * index time weight. */ public float score(float weight, float boost) { if (boost == 0f) { return weight; } if (weight == 0f) { return boost; } return weight * boost; } }