⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 booleanquery.java

📁 Lucene a java open-source SearchEngine Framework
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package org.apache.lucene.search;/** * 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. */import org.apache.lucene.index.IndexReader;import org.apache.lucene.util.ToStringUtils;import org.apache.lucene.search.BooleanClause.Occur;import java.io.IOException;import java.util.*;/** A Query that matches documents matching boolean combinations of other  * queries, e.g. {@link TermQuery}s, {@link PhraseQuery}s or other  * BooleanQuerys.  */public class BooleanQuery extends Query {  /**   */  private static int maxClauseCount = 1024;  /** Thrown when an attempt is made to add more than {@link   * #getMaxClauseCount()} clauses. This typically happens if   * a PrefixQuery, FuzzyQuery, WildcardQuery, or RangeQuery    * is expanded to many terms during search.    */  public static class TooManyClauses extends RuntimeException {    public TooManyClauses() {}    public String getMessage() {      return "maxClauseCount is set to " + maxClauseCount;    }  }  /** Return the maximum number of clauses permitted, 1024 by default.   * Attempts to add more than the permitted number of clauses cause {@link   * TooManyClauses} to be thrown.   * @see #setMaxClauseCount(int)   */  public static int getMaxClauseCount() { return maxClauseCount; }  /** Set the maximum number of clauses permitted per BooleanQuery.   * Default value is 1024.   * <p>TermQuery clauses are generated from for example prefix queries and   * fuzzy queries. Each TermQuery needs some buffer space during search,   * so this parameter indirectly controls the maximum buffer requirements for   * query search.   * <p>When this parameter becomes a bottleneck for a Query one can use a   * Filter. For example instead of a {@link RangeQuery} one can use a   * {@link RangeFilter}.   * <p>Normally the buffers are allocated by the JVM. When using for example   * {@link org.apache.lucene.store.MMapDirectory} the buffering is left to   * the operating system.   */  public static void setMaxClauseCount(int maxClauseCount) {    if (maxClauseCount < 1)      throw new IllegalArgumentException("maxClauseCount must be >= 1");    BooleanQuery.maxClauseCount = maxClauseCount;  }  private ArrayList clauses = new ArrayList();  private boolean disableCoord;  /** Constructs an empty boolean query. */  public BooleanQuery() {}  /** Constructs an empty boolean query.   *   * {@link Similarity#coord(int,int)} may be disabled in scoring, as   * appropriate. For example, this score factor does not make sense for most   * automatically generated queries, like {@link WildcardQuery} and {@link   * FuzzyQuery}.   *   * @param disableCoord disables {@link Similarity#coord(int,int)} in scoring.   */  public BooleanQuery(boolean disableCoord) {    this.disableCoord = disableCoord;  }  /** Returns true iff {@link Similarity#coord(int,int)} is disabled in   * scoring for this query instance.   * @see #BooleanQuery(boolean)   */  public boolean isCoordDisabled() { return disableCoord; }  // Implement coord disabling.  // Inherit javadoc.  public Similarity getSimilarity(Searcher searcher) {    Similarity result = super.getSimilarity(searcher);    if (disableCoord) {                           // disable coord as requested      result = new SimilarityDelegator(result) {          public float coord(int overlap, int maxOverlap) {            return 1.0f;          }        };    }    return result;  }  /**   * Specifies a minimum number of the optional BooleanClauses   * which must be satisfied.   *   * <p>   * By default no optional clauses are necessary for a match   * (unless there are no required clauses).  If this method is used,   * then the specified number of clauses is required.   * </p>   * <p>   * Use of this method is totally independent of specifying that   * any specific clauses are required (or prohibited).  This number will   * only be compared against the number of matching optional clauses.   * </p>   * <p>   * EXPERT NOTE: Using this method may force collecting docs in order,   * regardless of whether setAllowDocsOutOfOrder(true) has been called.   * </p>   *   * @param min the number of optional clauses that must match   * @see #setAllowDocsOutOfOrder   */  public void setMinimumNumberShouldMatch(int min) {    this.minNrShouldMatch = min;  }  protected int minNrShouldMatch = 0;  /**   * Gets the minimum number of the optional BooleanClauses   * which must be satisifed.   */  public int getMinimumNumberShouldMatch() {    return minNrShouldMatch;  }  /** Adds a clause to a boolean query.   *   * @throws TooManyClauses if the new number of clauses exceeds the maximum clause number   * @see #getMaxClauseCount()   */  public void add(Query query, BooleanClause.Occur occur) {    add(new BooleanClause(query, occur));  }  /** Adds a clause to a boolean query.   * @throws TooManyClauses if the new number of clauses exceeds the maximum clause number   * @see #getMaxClauseCount()   */  public void add(BooleanClause clause) {    if (clauses.size() >= maxClauseCount)      throw new TooManyClauses();    clauses.add(clause);  }  /** Returns the set of clauses in this query. */  public BooleanClause[] getClauses() {    return (BooleanClause[])clauses.toArray(new BooleanClause[clauses.size()]);  }  /** Returns the list of clauses in this query. */  public List clauses() { return clauses; }  private class BooleanWeight implements Weight {    protected Similarity similarity;    protected Vector weights = new Vector();    public BooleanWeight(Searcher searcher)      throws IOException {      this.similarity = getSimilarity(searcher);      for (int i = 0 ; i < clauses.size(); i++) {        BooleanClause c = (BooleanClause)clauses.get(i);        weights.add(c.getQuery().createWeight(searcher));      }    }    public Query getQuery() { return BooleanQuery.this; }    public float getValue() { return getBoost(); }    public float sumOfSquaredWeights() throws IOException {      float sum = 0.0f;      for (int i = 0 ; i < weights.size(); i++) {        BooleanClause c = (BooleanClause)clauses.get(i);        Weight w = (Weight)weights.elementAt(i);        // call sumOfSquaredWeights for all clauses in case of side effects        float s = w.sumOfSquaredWeights();         // sum sub weights        if (!c.isProhibited())          // only add to sum for non-prohibited clauses          sum += s;      }      sum *= getBoost() * getBoost();             // boost each sub-weight      return sum ;    }    public void normalize(float norm) {      norm *= getBoost();                         // incorporate boost      for (int i = 0 ; i < weights.size(); i++) {        Weight w = (Weight)weights.elementAt(i);        // normalize all clauses, (even if prohibited in case of side affects)        w.normalize(norm);      }    }    /** @return Returns BooleanScorer2 that uses and provides skipTo(),     *          and scores documents in document number order.     */    public Scorer scorer(IndexReader reader) throws IOException {      BooleanScorer2 result = new BooleanScorer2(similarity,                                                 minNrShouldMatch,                                                 allowDocsOutOfOrder);      for (int i = 0 ; i < weights.size(); i++) {        BooleanClause c = (BooleanClause)clauses.get(i);        Weight w = (Weight)weights.elementAt(i);        Scorer subScorer = w.scorer(reader);        if (subScorer != null)          result.add(subScorer, c.isRequired(), c.isProhibited());        else if (c.isRequired())          return null;      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -