Index: CHANGES.txt
===================================================================
--- CHANGES.txt (revision 808160)
+++ CHANGES.txt (working copy)
@@ -205,6 +205,12 @@
The usage of the US locale is important to guarantee correct ordering of
generated terms. (Uwe Schindler)
+15. LUCENE-1860: MultiTermQuery now defaults to
+ CONSTANT_SCORE_AUTO_REWRITE_DEFAULT rewrite method (previously it
+ was SCORING_BOOLEAN_QUERY_REWRITE). This means that PrefixQuery
+ and WildcardQuery will now produce constant score for all matching
+ docs, equal to the boost of the query. (Mike McCandless)
+
API Changes
1. LUCENE-1419: Add expert API to set custom indexing chain. This API is
Index: src/test/org/apache/lucene/search/TestBooleanPrefixQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestBooleanPrefixQuery.java (revision 808160)
+++ src/test/org/apache/lucene/search/TestBooleanPrefixQuery.java (working copy)
@@ -53,7 +53,22 @@
super(name);
}
- public void testMethod() {
+ private int getCount(IndexReader r, Query q) throws Exception {
+ if (q instanceof BooleanQuery) {
+ return ((BooleanQuery) q).getClauses().length;
+ } else if (q instanceof ConstantScoreQuery) {
+ DocIdSetIterator iter = ((ConstantScoreQuery) q).getFilter().getDocIdSet(r).iterator();
+ int count = 0;
+ while(iter.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
+ count++;
+ }
+ return count;
+ } else {
+ throw new RuntimeException("unepxected query " + q);
+ }
+ }
+
+ public void testMethod() throws Exception {
RAMDirectory directory = new RAMDirectory();
String[] categories = new String[]{"food",
@@ -63,6 +78,7 @@
Query rw1 = null;
Query rw2 = null;
+ IndexReader reader = null;
try {
IndexWriter writer = new IndexWriter(directory, new
WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
@@ -73,9 +89,8 @@
}
writer.close();
- IndexReader reader = IndexReader.open(directory);
+ reader = IndexReader.open(directory);
PrefixQuery query = new PrefixQuery(new Term("category", "foo"));
-
rw1 = query.rewrite(reader);
BooleanQuery bq = new BooleanQuery();
@@ -86,20 +101,7 @@
fail(e.getMessage());
}
- BooleanQuery bq1 = null;
- if (rw1 instanceof BooleanQuery) {
- bq1 = (BooleanQuery) rw1;
- }
-
- BooleanQuery bq2 = null;
- if (rw2 instanceof BooleanQuery) {
- bq2 = (BooleanQuery) rw2;
- } else {
- fail("Rewrite");
- }
-
- assertEquals("Number of Clauses Mismatch", bq1.getClauses().length,
- bq2.getClauses().length);
+ assertEquals("Number of Clauses Mismatch", getCount(reader, rw1), getCount(reader, rw2));
}
}
Index: src/java/org/apache/lucene/search/MultiTermQuery.java
===================================================================
--- src/java/org/apache/lucene/search/MultiTermQuery.java (revision 808160)
+++ src/java/org/apache/lucene/search/MultiTermQuery.java (working copy)
@@ -60,7 +60,7 @@
public abstract class MultiTermQuery extends Query {
/* @deprecated move to sub class */
protected Term term;
- protected RewriteMethod rewriteMethod = SCORING_BOOLEAN_QUERY_REWRITE;
+ protected RewriteMethod rewriteMethod = CONSTANT_SCORE_AUTO_REWRITE_DEFAULT;
transient int numberOfTerms = 0;
/** Abstract class that defines how the query is rewritten. */
Index: src/java/org/apache/lucene/search/PrefixQuery.java
===================================================================
--- src/java/org/apache/lucene/search/PrefixQuery.java (revision 808160)
+++ src/java/org/apache/lucene/search/PrefixQuery.java (working copy)
@@ -26,13 +26,9 @@
/** A Query that matches documents containing terms with a specified prefix. A PrefixQuery
* is built by QueryParser for input like app*.
*
- *
NOTE: Currently this query uses {@link - * MultiTermQuery#SCORING_BOOLEAN_QUERY_REWRITE}, which - * assigns not-very-useful scores to the resulting hits. In - * 3.0 this default will change to {@link - * MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT}; you - * can use {@link MultiTermQuery#setRewriteMethod} to change - * it. */ + *
This query uses the {@link
+ * MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT}
+ * rewrite method. */
public class PrefixQuery extends MultiTermQuery {
private Term prefix;
Index: src/java/org/apache/lucene/search/TermRangeQuery.java
===================================================================
--- src/java/org/apache/lucene/search/TermRangeQuery.java (revision 808160)
+++ src/java/org/apache/lucene/search/TermRangeQuery.java (working copy)
@@ -109,7 +109,6 @@
this.includeLower = includeLower;
this.includeUpper = includeUpper;
this.collator = collator;
- rewriteMethod = CONSTANT_SCORE_AUTO_REWRITE_DEFAULT;
}
/** Returns the field name for this query */
Index: src/java/org/apache/lucene/search/WildcardQuery.java
===================================================================
--- src/java/org/apache/lucene/search/WildcardQuery.java (revision 808160)
+++ src/java/org/apache/lucene/search/WildcardQuery.java (working copy)
@@ -30,12 +30,9 @@
* a Wildcard term should not start with one of the wildcards * or
* ?.
*
- *
NOTE: Currently this query uses {@link - * MultiTermQuery#SCORING_BOOLEAN_QUERY_REWRITE}, which - * assigns not-very-useful scores to the resulting hits. In - * 3.0 this default will change to {@link - * MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT}; you can use {@link - * MultiTermQuery#setRewriteMethod} to change it. + *
This query uses the {@link + * MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT} + * rewrite method. * * @see WildcardTermEnum */ public class WildcardQuery extends MultiTermQuery { Index: contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java =================================================================== --- contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java (revision 808160) +++ contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java (working copy) @@ -50,8 +50,7 @@ public Query rewrite(IndexReader reader) throws IOException { RegexQuery orig = new RegexQuery(term); orig.setRegexImplementation(regexImpl); - - // RegexQuery (via MultiTermQuery).rewrite always returns a BooleanQuery + orig.setRewriteMethod(RegexQuery.SCORING_BOOLEAN_QUERY_REWRITE); BooleanQuery bq = (BooleanQuery) orig.rewrite(reader); BooleanClause[] clauses = bq.getClauses(); Index: tags/lucene_2_4_back_compat_tests_20090815/src/test/org/apache/lucene/search/TestBooleanPrefixQuery.java =================================================================== --- tags/lucene_2_4_back_compat_tests_20090815/src/test/org/apache/lucene/search/TestBooleanPrefixQuery.java (revision 808164) +++ tags/lucene_2_4_back_compat_tests_20090815/src/test/org/apache/lucene/search/TestBooleanPrefixQuery.java (working copy) @@ -53,7 +53,22 @@ super(name); } - public void testMethod() { + private int getCount(IndexReader r, Query q) throws Exception { + if (q instanceof BooleanQuery) { + return ((BooleanQuery) q).getClauses().length; + } else if (q instanceof ConstantScoreQuery) { + DocIdSetIterator iter = ((ConstantScoreQuery) q).getFilter().getDocIdSet(r).iterator(); + int count = 0; + while(iter.next()) { + count++; + } + return count; + } else { + throw new RuntimeException("unepxected query " + q); + } + } + + public void testMethod() throws Exception { RAMDirectory directory = new RAMDirectory(); String[] categories = new String[]{"food", @@ -63,6 +78,7 @@ Query rw1 = null; Query rw2 = null; + IndexReader reader = null; try { IndexWriter writer = new IndexWriter(directory, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); @@ -73,9 +89,8 @@ } writer.close(); - IndexReader reader = IndexReader.open(directory); + reader = IndexReader.open(directory); PrefixQuery query = new PrefixQuery(new Term("category", "foo")); - rw1 = query.rewrite(reader); BooleanQuery bq = new BooleanQuery(); @@ -86,20 +101,7 @@ fail(e.getMessage()); } - BooleanQuery bq1 = null; - if (rw1 instanceof BooleanQuery) { - bq1 = (BooleanQuery) rw1; - } - - BooleanQuery bq2 = null; - if (rw2 instanceof BooleanQuery) { - bq2 = (BooleanQuery) rw2; - } else { - fail("Rewrite"); - } - - assertEquals("Number of Clauses Mismatch", bq1.getClauses().length, - bq2.getClauses().length); + assertEquals("Number of Clauses Mismatch", getCount(reader, rw1), getCount(reader, rw2)); } }