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

📄 booleanquery.java

📁 Lucene a java open-source SearchEngine Framework
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
      return result;    }    public Explanation explain(IndexReader reader, int doc)      throws IOException {      final int minShouldMatch =        BooleanQuery.this.getMinimumNumberShouldMatch();      ComplexExplanation sumExpl = new ComplexExplanation();      sumExpl.setDescription("sum of:");      int coord = 0;      int maxCoord = 0;      float sum = 0.0f;      boolean fail = false;      int shouldMatchCount = 0;      for (int i = 0 ; i < weights.size(); i++) {        BooleanClause c = (BooleanClause)clauses.get(i);        Weight w = (Weight)weights.elementAt(i);        Explanation e = w.explain(reader, doc);        if (!c.isProhibited()) maxCoord++;        if (e.isMatch()) {          if (!c.isProhibited()) {            sumExpl.addDetail(e);            sum += e.getValue();            coord++;          } else {            Explanation r =              new Explanation(0.0f, "match on prohibited clause (" + c.getQuery().toString() + ")");            r.addDetail(e);            sumExpl.addDetail(r);            fail = true;          }          if (c.getOccur().equals(Occur.SHOULD))            shouldMatchCount++;        } else if (c.isRequired()) {          Explanation r = new Explanation(0.0f, "no match on required clause (" + c.getQuery().toString() + ")");          r.addDetail(e);          sumExpl.addDetail(r);          fail = true;        }      }      if (fail) {        sumExpl.setMatch(Boolean.FALSE);        sumExpl.setValue(0.0f);        sumExpl.setDescription          ("Failure to meet condition(s) of required/prohibited clause(s)");        return sumExpl;      } else if (shouldMatchCount < minShouldMatch) {        sumExpl.setMatch(Boolean.FALSE);        sumExpl.setValue(0.0f);        sumExpl.setDescription("Failure to match minimum number "+                               "of optional clauses: " + minShouldMatch);        return sumExpl;      }            sumExpl.setMatch(0 < coord ? Boolean.TRUE : Boolean.FALSE);      sumExpl.setValue(sum);            float coordFactor = similarity.coord(coord, maxCoord);      if (coordFactor == 1.0f)                      // coord is no-op        return sumExpl;                             // eliminate wrapper      else {        ComplexExplanation result = new ComplexExplanation(sumExpl.isMatch(),                                                           sum*coordFactor,                                                           "product of:");        result.addDetail(sumExpl);        result.addDetail(new Explanation(coordFactor,                                         "coord("+coord+"/"+maxCoord+")"));        return result;      }    }  }  /** Whether hit docs may be collected out of docid order. */  private static boolean allowDocsOutOfOrder = false;  /**   * Expert: Indicates whether hit docs may be collected out of docid   * order.   *   * <p>   * Background: although the contract of the Scorer class requires that   * documents be iterated in order of doc id, this was not true in early   * versions of Lucene.  Many pieces of functionality in the current   * Lucene code base have undefined behavior if this contract is not   * upheld, but in some specific simple cases may be faster.  (For   * example: disjunction queries with less than 32 prohibited clauses;   * This setting has no effect for other queries.)   * </p>   *   * <p>   * Specifics: By setting this option to true, calls to    * {@link HitCollector#collect(int,float)} might be   * invoked first for docid N and only later for docid N-1.   * Being static, this setting is system wide.   * </p>   */  public static void setAllowDocsOutOfOrder(boolean allow) {    allowDocsOutOfOrder = allow;  }      /**   * Whether hit docs may be collected out of docid order.   * @see #setAllowDocsOutOfOrder(boolean)   */  public static boolean getAllowDocsOutOfOrder() {    return allowDocsOutOfOrder;  }      /**   * @deprecated Use {@link #setAllowDocsOutOfOrder(boolean)} instead.    */  public static void setUseScorer14(boolean use14) {	setAllowDocsOutOfOrder(use14);  }    /**   * @deprecated Use {@link #getAllowDocsOutOfOrder()} instead.   */  public static boolean getUseScorer14() {	return getAllowDocsOutOfOrder();  }  protected Weight createWeight(Searcher searcher) throws IOException {    return new BooleanWeight(searcher);  }  public Query rewrite(IndexReader reader) throws IOException {    if (clauses.size() == 1) {                    // optimize 1-clause queries      BooleanClause c = (BooleanClause)clauses.get(0);      if (!c.isProhibited()) {			  // just return clause        Query query = c.getQuery().rewrite(reader);    // rewrite first        if (getBoost() != 1.0f) {                 // incorporate boost          if (query == c.getQuery())                   // if rewrite was no-op            query = (Query)query.clone();         // then clone before boost          query.setBoost(getBoost() * query.getBoost());        }        return query;      }    }    BooleanQuery clone = null;                    // recursively rewrite    for (int i = 0 ; i < clauses.size(); i++) {      BooleanClause c = (BooleanClause)clauses.get(i);      Query query = c.getQuery().rewrite(reader);      if (query != c.getQuery()) {                     // clause rewrote: must clone        if (clone == null)          clone = (BooleanQuery)this.clone();        clone.clauses.set(i, new BooleanClause(query, c.getOccur()));      }    }    if (clone != null) {      return clone;                               // some clauses rewrote    } else      return this;                                // no clauses rewrote  }  // inherit javadoc  public void extractTerms(Set terms) {      for (Iterator i = clauses.iterator(); i.hasNext();) {          BooleanClause clause = (BooleanClause) i.next();          clause.getQuery().extractTerms(terms);        }  }  public Object clone() {    BooleanQuery clone = (BooleanQuery)super.clone();    clone.clauses = (ArrayList)this.clauses.clone();    return clone;  }  /** Prints a user-readable version of this query. */  public String toString(String field) {    StringBuffer buffer = new StringBuffer();    boolean needParens=(getBoost() != 1.0) || (getMinimumNumberShouldMatch()>0) ;    if (needParens) {      buffer.append("(");    }    for (int i = 0 ; i < clauses.size(); i++) {      BooleanClause c = (BooleanClause)clauses.get(i);      if (c.isProhibited())        buffer.append("-");      else if (c.isRequired())        buffer.append("+");      Query subQuery = c.getQuery();      if (subQuery instanceof BooleanQuery) {	  // wrap sub-bools in parens        buffer.append("(");        buffer.append(c.getQuery().toString(field));        buffer.append(")");      } else        buffer.append(c.getQuery().toString(field));      if (i != clauses.size()-1)        buffer.append(" ");    }    if (needParens) {      buffer.append(")");    }    if (getMinimumNumberShouldMatch()>0) {      buffer.append('~');      buffer.append(getMinimumNumberShouldMatch());    }    if (getBoost() != 1.0f)    {      buffer.append(ToStringUtils.boost(getBoost()));    }    return buffer.toString();  }  /** Returns true iff <code>o</code> is equal to this. */  public boolean equals(Object o) {    if (!(o instanceof BooleanQuery))      return false;    BooleanQuery other = (BooleanQuery)o;    return (this.getBoost() == other.getBoost())        && this.clauses.equals(other.clauses)        && this.getMinimumNumberShouldMatch() == other.getMinimumNumberShouldMatch();  }  /** Returns a hash code value for this object.*/  public int hashCode() {    return Float.floatToIntBits(getBoost()) ^ clauses.hashCode()           + getMinimumNumberShouldMatch();  }}

⌨️ 快捷键说明

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