mirror of https://github.com/apache/lucene.git
SOLR-435 Improvements to SOLR-2001 (blank 'q') includes empty string check, dismax support, and test
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1306152 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b083a2f530
commit
461e7884c6
|
@ -22,7 +22,6 @@ import org.apache.lucene.search.BooleanClause;
|
||||||
import org.apache.lucene.search.BooleanQuery;
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.solr.schema.IndexSchema;
|
import org.apache.solr.schema.IndexSchema;
|
||||||
import org.apache.solr.common.SolrException;
|
|
||||||
import org.apache.solr.common.params.DisMaxParams;
|
import org.apache.solr.common.params.DisMaxParams;
|
||||||
import org.apache.solr.common.params.SolrParams;
|
import org.apache.solr.common.params.SolrParams;
|
||||||
import org.apache.solr.common.util.NamedList;
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
@ -92,7 +91,9 @@ public class DisMaxQParser extends QParser {
|
||||||
*/
|
*/
|
||||||
BooleanQuery query = new BooleanQuery(true);
|
BooleanQuery query = new BooleanQuery(true);
|
||||||
|
|
||||||
addMainQuery(query, solrParams);
|
boolean notBlank = addMainQuery(query, solrParams);
|
||||||
|
if (!notBlank)
|
||||||
|
return null;
|
||||||
addBoostQuery(query, solrParams);
|
addBoostQuery(query, solrParams);
|
||||||
addBoostFunctions(query, solrParams);
|
addBoostFunctions(query, solrParams);
|
||||||
|
|
||||||
|
@ -151,7 +152,8 @@ public class DisMaxQParser extends QParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addMainQuery(BooleanQuery query, SolrParams solrParams) throws ParseException {
|
/** Adds the main query to the query argument. If its blank then false is returned. */
|
||||||
|
protected boolean addMainQuery(BooleanQuery query, SolrParams solrParams) throws ParseException {
|
||||||
Map<String, Float> phraseFields = SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.PF));
|
Map<String, Float> phraseFields = SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.PF));
|
||||||
float tiebreaker = solrParams.getFloat(DisMaxParams.TIE, 0.0f);
|
float tiebreaker = solrParams.getFloat(DisMaxParams.TIE, 0.0f);
|
||||||
|
|
||||||
|
@ -170,6 +172,8 @@ public class DisMaxQParser extends QParser {
|
||||||
if (userQuery == null || userQuery.trim().length() < 1) {
|
if (userQuery == null || userQuery.trim().length() < 1) {
|
||||||
// If no query is specified, we may have an alternate
|
// If no query is specified, we may have an alternate
|
||||||
altUserQuery = getAlternateUserQuery(solrParams);
|
altUserQuery = getAlternateUserQuery(solrParams);
|
||||||
|
if (altUserQuery == null)
|
||||||
|
return false;
|
||||||
query.add(altUserQuery, BooleanClause.Occur.MUST);
|
query.add(altUserQuery, BooleanClause.Occur.MUST);
|
||||||
} else {
|
} else {
|
||||||
// There is a valid query string
|
// There is a valid query string
|
||||||
|
@ -184,6 +188,7 @@ public class DisMaxQParser extends QParser {
|
||||||
query.add(phrase, BooleanClause.Occur.SHOULD);
|
query.add(phrase, BooleanClause.Occur.SHOULD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Query getAlternateUserQuery(SolrParams solrParams) throws ParseException {
|
protected Query getAlternateUserQuery(SolrParams solrParams) throws ParseException {
|
||||||
|
@ -192,7 +197,7 @@ public class DisMaxQParser extends QParser {
|
||||||
QParser altQParser = subQuery(altQ, null);
|
QParser altQParser = subQuery(altQ, null);
|
||||||
return altQParser.getQuery();
|
return altQParser.getQuery();
|
||||||
} else {
|
} else {
|
||||||
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "missing query string");
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -172,7 +172,7 @@ class ExtendedDismaxQParser extends QParser {
|
||||||
query.add( altUserQuery , BooleanClause.Occur.MUST );
|
query.add( altUserQuery , BooleanClause.Occur.MUST );
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
// throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "missing query string" );
|
// throw new ParseException("missing query string" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -19,7 +19,6 @@ package org.apache.solr.search;
|
||||||
import org.apache.lucene.queryparser.classic.ParseException;
|
import org.apache.lucene.queryparser.classic.ParseException;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.Sort;
|
import org.apache.lucene.search.Sort;
|
||||||
import org.apache.solr.common.SolrException;
|
|
||||||
import org.apache.solr.common.params.CommonParams;
|
import org.apache.solr.common.params.CommonParams;
|
||||||
import org.apache.solr.common.params.SolrParams;
|
import org.apache.solr.common.params.SolrParams;
|
||||||
import org.apache.solr.common.util.NamedList;
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
@ -48,7 +47,6 @@ public class LuceneQParserPlugin extends QParserPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
class LuceneQParser extends QParser {
|
class LuceneQParser extends QParser {
|
||||||
String sortStr;
|
|
||||||
SolrQueryParser lparser;
|
SolrQueryParser lparser;
|
||||||
|
|
||||||
public LuceneQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
|
public LuceneQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
|
||||||
|
@ -59,7 +57,7 @@ class LuceneQParser extends QParser {
|
||||||
@Override
|
@Override
|
||||||
public Query parse() throws ParseException {
|
public Query parse() throws ParseException {
|
||||||
String qstr = getString();
|
String qstr = getString();
|
||||||
if (qstr == null) return null;
|
if (qstr == null || qstr.length()==0) return null;
|
||||||
|
|
||||||
String defaultField = getParam(CommonParams.DF);
|
String defaultField = getParam(CommonParams.DF);
|
||||||
if (defaultField==null) {
|
if (defaultField==null) {
|
||||||
|
@ -95,6 +93,8 @@ class OldLuceneQParser extends LuceneQParser {
|
||||||
// handle legacy "query;sort" syntax
|
// handle legacy "query;sort" syntax
|
||||||
if (getLocalParams() == null) {
|
if (getLocalParams() == null) {
|
||||||
String qstr = getString();
|
String qstr = getString();
|
||||||
|
if (qstr == null || qstr.length() == 0)
|
||||||
|
return null;
|
||||||
sortStr = getParams().get(CommonParams.SORT);
|
sortStr = getParams().get(CommonParams.SORT);
|
||||||
if (sortStr == null) {
|
if (sortStr == null) {
|
||||||
// sort may be legacy form, included in the query string
|
// sort may be legacy form, included in the query string
|
||||||
|
@ -107,7 +107,7 @@ class OldLuceneQParser extends LuceneQParser {
|
||||||
qstr = commands.get(0);
|
qstr = commands.get(0);
|
||||||
}
|
}
|
||||||
else if (commands.size() > 2) {
|
else if (commands.size() > 2) {
|
||||||
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "If you want to use multiple ';' in the query, use the 'sort' param.");
|
throw new ParseException("If you want to use multiple ';' in the query, use the 'sort' param.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setString(qstr);
|
setString(qstr);
|
||||||
|
|
|
@ -96,7 +96,8 @@ public abstract class QParser {
|
||||||
lst.add(val);
|
lst.add(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create and return the <code>Query</code> object represented by <code>qstr</code>
|
/** Create and return the <code>Query</code> object represented by <code>qstr</code>. Null MAY be returned to signify
|
||||||
|
* there was no input (e.g. no query string) to parse.
|
||||||
* @see #getQuery()
|
* @see #getQuery()
|
||||||
**/
|
**/
|
||||||
public abstract Query parse() throws ParseException;
|
public abstract Query parse() throws ParseException;
|
||||||
|
|
|
@ -16,6 +16,7 @@ package org.apache.solr.search;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.Sort;
|
import org.apache.lucene.search.Sort;
|
||||||
import org.apache.lucene.search.SortField;
|
import org.apache.lucene.search.SortField;
|
||||||
import org.apache.solr.SolrTestCaseJ4;
|
import org.apache.solr.SolrTestCaseJ4;
|
||||||
|
@ -35,6 +36,40 @@ public class QueryParsingTest extends SolrTestCaseJ4 {
|
||||||
initCore("solrconfig.xml","schema.xml");
|
initCore("solrconfig.xml","schema.xml");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that the main QParserPlugins people are likely to use
|
||||||
|
* as defaults fail with a consistent exception when the query string
|
||||||
|
* is either empty or null.
|
||||||
|
* @see <a href="https://issues.apache.org/jira/browse/SOLR-435">SOLR-435</a>
|
||||||
|
* @see <a href="https://issues.apache.org/jira/browse/SOLR-2001">SOLR-2001</a>
|
||||||
|
*/
|
||||||
|
public void testQParserEmptyInput() throws Exception {
|
||||||
|
|
||||||
|
SolrQueryRequest req = req();
|
||||||
|
|
||||||
|
final String[] parsersTested = new String[] {
|
||||||
|
OldLuceneQParserPlugin.NAME,
|
||||||
|
LuceneQParserPlugin.NAME,
|
||||||
|
DisMaxQParserPlugin.NAME,
|
||||||
|
ExtendedDismaxQParserPlugin.NAME
|
||||||
|
};
|
||||||
|
|
||||||
|
for (String defType : parsersTested) {
|
||||||
|
for (String qstr : new String[] {null, ""}) {
|
||||||
|
QParser parser = null;
|
||||||
|
try {
|
||||||
|
parser = QParser.getParser(qstr, defType, req);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("getParser excep using defType=" +
|
||||||
|
defType + " with qstr="+qstr, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
Query q = parser.parse();
|
||||||
|
assertNull("expected no query",q);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSort() throws Exception {
|
public void testSort() throws Exception {
|
||||||
Sort sort;
|
Sort sort;
|
||||||
|
|
Loading…
Reference in New Issue