mirror of https://github.com/apache/lucene.git
LUCENE-1792: properly default rewrite method to CONSTANT_SCORE_AUTO for wildcard & prefix queries
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@803053 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cbfee9d814
commit
7ac73cb0a6
|
@ -18,6 +18,7 @@ package org.apache.lucene.queryParser.core.nodes;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.lucene.queryParser.core.parser.EscapeQuerySyntax;
|
import org.apache.lucene.queryParser.core.parser.EscapeQuerySyntax;
|
||||||
|
import org.apache.lucene.search.MultiTermQuery;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link WildcardQueryNode} represents wildcard query This does not apply to
|
* A {@link WildcardQueryNode} represents wildcard query This does not apply to
|
||||||
|
@ -25,6 +26,7 @@ import org.apache.lucene.queryParser.core.parser.EscapeQuerySyntax;
|
||||||
*/
|
*/
|
||||||
public class WildcardQueryNode extends FieldQueryNode {
|
public class WildcardQueryNode extends FieldQueryNode {
|
||||||
private static final long serialVersionUID = 0L;
|
private static final long serialVersionUID = 0L;
|
||||||
|
private MultiTermQuery.RewriteMethod multiTermRewriteMethod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param field
|
* @param field
|
||||||
|
@ -60,4 +62,15 @@ public class WildcardQueryNode extends FieldQueryNode {
|
||||||
|
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the rewrite method
|
||||||
|
*/
|
||||||
|
public MultiTermQuery.RewriteMethod getMultiTermRewriteMethod() {
|
||||||
|
return multiTermRewriteMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMultiTermRewriteMethod(MultiTermQuery.RewriteMethod method) {
|
||||||
|
multiTermRewriteMethod = method;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,9 +36,10 @@ public class PrefixWildcardQueryNodeBuilder implements StandardQueryBuilder {
|
||||||
public PrefixQuery build(QueryNode queryNode) throws QueryNodeException {
|
public PrefixQuery build(QueryNode queryNode) throws QueryNodeException {
|
||||||
PrefixWildcardQueryNode wildcardNode = (PrefixWildcardQueryNode) queryNode;
|
PrefixWildcardQueryNode wildcardNode = (PrefixWildcardQueryNode) queryNode;
|
||||||
|
|
||||||
return new PrefixQuery(new Term(wildcardNode.getFieldAsString(),
|
PrefixQuery q = new PrefixQuery(new Term(wildcardNode.getFieldAsString(),
|
||||||
wildcardNode.getTextAsString()));
|
wildcardNode.getTextAsString()));
|
||||||
|
q.setRewriteMethod(wildcardNode.getMultiTermRewriteMethod());
|
||||||
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,9 +36,10 @@ public class WildcardQueryNodeBuilder implements StandardQueryBuilder {
|
||||||
public WildcardQuery build(QueryNode queryNode) throws QueryNodeException {
|
public WildcardQuery build(QueryNode queryNode) throws QueryNodeException {
|
||||||
WildcardQueryNode wildcardNode = (WildcardQueryNode) queryNode;
|
WildcardQueryNode wildcardNode = (WildcardQueryNode) queryNode;
|
||||||
|
|
||||||
return new WildcardQuery(new Term(wildcardNode.getFieldAsString(),
|
WildcardQuery q = new WildcardQuery(new Term(wildcardNode.getFieldAsString(),
|
||||||
wildcardNode.getTextAsString()));
|
wildcardNode.getTextAsString()));
|
||||||
|
q.setRewriteMethod(wildcardNode.getMultiTermRewriteMethod());
|
||||||
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package org.apache.lucene.queryParser.standard.processors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 java.util.List;
|
||||||
|
|
||||||
|
import org.apache.lucene.queryParser.core.nodes.QueryNode;
|
||||||
|
import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode;
|
||||||
|
import org.apache.lucene.queryParser.core.nodes.PrefixWildcardQueryNode;
|
||||||
|
import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl;
|
||||||
|
import org.apache.lucene.search.MultiTermQuery;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This processor instates the default {@link
|
||||||
|
* MultiTermQuery.RewriteMethod}, {@link
|
||||||
|
* MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT}, for
|
||||||
|
* multi-term query nodes.
|
||||||
|
*/
|
||||||
|
public class MultiTermRewriteDefaultProcessor extends QueryNodeProcessorImpl {
|
||||||
|
|
||||||
|
protected QueryNode postProcessNode(QueryNode node) {
|
||||||
|
if (node instanceof WildcardQueryNode) {
|
||||||
|
((WildcardQueryNode) node).setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
|
||||||
|
} else if (node instanceof PrefixWildcardQueryNode) {
|
||||||
|
((PrefixWildcardQueryNode) node).setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected QueryNode preProcessNode(QueryNode node) {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<QueryNode> setChildrenOrder(List<QueryNode> children) {
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
}
|
|
@ -64,6 +64,7 @@ public class StandardQueryNodeProcessorPipeline extends
|
||||||
addProcessor(new BooleanSingleChildOptimizationQueryNodeProcessor());
|
addProcessor(new BooleanSingleChildOptimizationQueryNodeProcessor());
|
||||||
addProcessor(new DefaultPhraseSlopQueryNodeProcessor());
|
addProcessor(new DefaultPhraseSlopQueryNodeProcessor());
|
||||||
addProcessor(new BoostQueryNodeProcessor());
|
addProcessor(new BoostQueryNodeProcessor());
|
||||||
|
addProcessor(new MultiTermRewriteDefaultProcessor());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -320,6 +320,21 @@ public class TestQPHelper extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testConstantScoreAutoRewrite() throws Exception {
|
||||||
|
StandardQueryParser qp = new StandardQueryParser(new WhitespaceAnalyzer());
|
||||||
|
Query q = qp.parse("foo*bar", "field");
|
||||||
|
assertTrue(q instanceof WildcardQuery);
|
||||||
|
assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod());
|
||||||
|
|
||||||
|
q = qp.parse("foo*", "field");
|
||||||
|
assertTrue(q instanceof PrefixQuery);
|
||||||
|
assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod());
|
||||||
|
|
||||||
|
q = qp.parse("[a TO z]", "field");
|
||||||
|
assertTrue(q instanceof TermRangeQuery);
|
||||||
|
assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod());
|
||||||
|
}
|
||||||
|
|
||||||
public void testCJK() throws Exception {
|
public void testCJK() throws Exception {
|
||||||
// Test Ideographic Space - As wide as a CJK character cell (fullwidth)
|
// Test Ideographic Space - As wide as a CJK character cell (fullwidth)
|
||||||
// used google to translate the word "term" to japanese -> ??
|
// used google to translate the word "term" to japanese -> ??
|
||||||
|
|
Loading…
Reference in New Issue