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

📄 booleanquery.java

📁 中文分词,中科院分词的改装版。使用java调用dll来实现的。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package org.apache.lucene.search;/** * Copyright 2004-2005 The Apache Software Foundation * * Licensed 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 java.io.IOException;import java.util.Iterator;import java.util.Set;import java.util.Vector;/** 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 {}  /** 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 Vector clauses = new Vector();  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 satisifed.   *   * <p>   * By default no optional clauses are neccessary for a match   * (unless there are no required clauses).  If this method is used,   * then the specified numebr of clauses is required.   * </p>   * <p>   * Use of this method is totally independant 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 will force the use of BooleanWeight2,   * regardless of wether setUseScorer14(true) has been called.   * </p>   *   * @param min the number of optional clauses that must match   * @see #setUseScorer14   */  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.addElement(clause);  }  /** Returns the set of clauses in this query. */  public BooleanClause[] getClauses() {    return (BooleanClause[])clauses.toArray(new BooleanClause[0]);  }  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.elementAt(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.elementAt(i);        Weight w = (Weight)weights.elementAt(i);        if (!c.isProhibited())          sum += w.sumOfSquaredWeights();         // sum sub weights      }      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++) {        BooleanClause c = (BooleanClause)clauses.elementAt(i);        Weight w = (Weight)weights.elementAt(i);        if (!c.isProhibited())          w.normalize(norm);      }    }    /** @return A good old 1.4 Scorer */    public Scorer scorer(IndexReader reader) throws IOException {      // First see if the (faster) ConjunctionScorer will work.  This can be      // used when all clauses are required.  Also, at this point a      // BooleanScorer cannot be embedded in a ConjunctionScorer, as the hits      // from a BooleanScorer are not always sorted by document number (sigh)      // and hence BooleanScorer cannot implement skipTo() correctly, which is      // required by ConjunctionScorer.      boolean allRequired = true;      boolean noneBoolean = true;      for (int i = 0 ; i < weights.size(); i++) {        BooleanClause c = (BooleanClause)clauses.elementAt(i);        if (!c.isRequired())          allRequired = false;        if (c.getQuery() instanceof BooleanQuery)          noneBoolean = false;      }      if (allRequired && noneBoolean) {           // ConjunctionScorer is okay        ConjunctionScorer result =          new ConjunctionScorer(similarity);

⌨️ 快捷键说明

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