Author: shalin
Date: Thu May 28 08:00:55 2009
New Revision: 779469
URL: http://svn.apache.org/viewvc?rev=779469&view=rev
Log:
SOLR-786 -- Refactor DisMaxQParser to allow overriding certain features of
DisMaxQParser
Modified:
lucene/solr/trunk/CHANGES.txt
lucene/solr/trunk/src/java/org/apache/solr/search/DisMaxQParser.java
Modified: lucene/solr/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=779469&r1=779468&r2=779469&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Thu May 28 08:00:55 2009
@@ -423,7 +423,7 @@
8. SOLR-875: Upgraded to Lucene 2.9-dev (r723985) and consolidated the BitSet
implementations (Michael Busch, gsingers)
9. SOLR-819: Upgraded to Lucene 2.9-dev (r724059) to get access to Arabic
public constructors (gsingers)
-
+ and
10. SOLR-900: Moved solrj into /src/solrj. The contents of solr-common.jar is
now included
in the solr-solrj.jar. (ryan)
@@ -484,6 +484,9 @@
34. Upgraded to Lucene 2.9-dev r779312 (yonik)
+35. SOLR-786: Refactor DisMaxQParser to allow overriding certain features of
DisMaxQParser
+ (Wojciech Biela via shalin)
+
Build
----------------------
1. SOLR-776: Added in ability to sign artifacts via Ant for releases
(gsingers)
Modified: lucene/solr/trunk/src/java/org/apache/solr/search/DisMaxQParser.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/DisMaxQParser.java?rev=779469&r1=779468&r2=779469&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/DisMaxQParser.java
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/DisMaxQParser.java Thu
May 28 08:00:55 2009
@@ -17,7 +17,6 @@
package org.apache.solr.search;
import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
@@ -27,7 +26,6 @@
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.schema.IndexSchema;
import org.apache.solr.util.SolrPluginUtils;
import java.util.ArrayList;
@@ -66,92 +64,39 @@
public Query parse() throws ParseException {
SolrParams solrParams = localParams == null ? params : new
DefaultSolrParams(localParams, params);
-
- IndexSchema schema = req.getSchema();
-
queryFields =
SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.QF));
- Map<String, Float> phraseFields =
SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.PF));
-
- float tiebreaker = solrParams.getFloat(DisMaxParams.TIE, 0.0f);
-
- int pslop = solrParams.getInt(DisMaxParams.PS, 0);
- int qslop = solrParams.getInt(DisMaxParams.QS, 0);
-
- /* a generic parser for parsing regular lucene queries */
- QueryParser p = schema.getSolrQueryParser(null);
-
- /* a parser for dealing with user input, which will convert
- * things to DisjunctionMaxQueries
- */
- SolrPluginUtils.DisjunctionMaxQueryParser up =
- new SolrPluginUtils.DisjunctionMaxQueryParser(schema,
IMPOSSIBLE_FIELD_NAME);
- up.addAlias(IMPOSSIBLE_FIELD_NAME,
- tiebreaker, queryFields);
- up.setPhraseSlop(qslop);
-
- /* for parsing sloppy phrases using DisjunctionMaxQueries */
- SolrPluginUtils.DisjunctionMaxQueryParser pp =
- new SolrPluginUtils.DisjunctionMaxQueryParser(schema,
IMPOSSIBLE_FIELD_NAME);
- pp.addAlias(IMPOSSIBLE_FIELD_NAME,
- tiebreaker, phraseFields);
- pp.setPhraseSlop(pslop);
-
/* the main query we will execute. we disable the coord because
* this query is an artificial construct
*/
BooleanQuery query = new BooleanQuery(true);
- /* * * Main User Query * * */
- parsedUserQuery = null;
- String userQuery = getString();
- altUserQuery = null;
- if (userQuery == null || userQuery.trim().length() < 1) {
- // If no query is specified, we may have an alternate
- String altQ = solrParams.get(DisMaxParams.ALTQ);
- if (altQ != null) {
- altQParser = subQuery(altQ, null);
- altUserQuery = altQParser.parse();
- query.add(altUserQuery, BooleanClause.Occur.MUST);
- } else {
- throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "missing
query string");
- }
- } else {
- // There is a valid query string
- userQuery =
SolrPluginUtils.partialEscape(SolrPluginUtils.stripUnbalancedQuotes(userQuery)).toString();
- userQuery = SolrPluginUtils.stripIllegalOperators(userQuery).toString();
-
- String minShouldMatch = solrParams.get(DisMaxParams.MM, "100%");
- Query dis = up.parse(userQuery);
- parsedUserQuery = dis;
-
- if (dis instanceof BooleanQuery) {
- BooleanQuery t = new BooleanQuery();
- SolrPluginUtils.flattenBooleanQuery(t, (BooleanQuery) dis);
- SolrPluginUtils.setMinShouldMatch(t, minShouldMatch);
- parsedUserQuery = t;
- }
- query.add(parsedUserQuery, BooleanClause.Occur.MUST);
+ addMainQuery(query, solrParams);
+ addBoostQuery(query, solrParams);
+ addBoostFunctions(query, solrParams);
+ return query;
+ }
- /* * * Add on Phrases for the Query * * */
-
- /* build up phrase boosting queries */
-
- /* if the userQuery already has some quotes, strip them out.
- * we've already done the phrases they asked for in the main
- * part of the query, this is to boost docs that may not have
- * matched those phrases but do match looser phrases.
- */
- String userPhraseQuery = userQuery.replace("\"", "");
- Query phrase = pp.parse("\"" + userPhraseQuery + "\"");
- if (null != phrase) {
- query.add(phrase, BooleanClause.Occur.SHOULD);
+ protected void addBoostFunctions(BooleanQuery query, SolrParams solrParams)
throws ParseException {
+ String[] boostFuncs = solrParams.getParams(DisMaxParams.BF);
+ if (null != boostFuncs && 0 != boostFuncs.length) {
+ for (String boostFunc : boostFuncs) {
+ if (null == boostFunc || "".equals(boostFunc)) continue;
+ Map<String, Float> ff = SolrPluginUtils.parseFieldBoosts(boostFunc);
+ for (String f : ff.keySet()) {
+ Query fq = subQuery(f, FunctionQParserPlugin.NAME).parse();
+ Float b = ff.get(f);
+ if (null != b) {
+ fq.setBoost(b);
+ }
+ query.add(fq, BooleanClause.Occur.SHOULD);
+ }
}
}
+ }
-
- /* * * Boosting Query * * */
+ protected void addBoostQuery(BooleanQuery query, SolrParams solrParams)
throws ParseException {
boostParams = solrParams.getParams(DisMaxParams.BQ);
//List<Query> boostQueries = SolrPluginUtils.parseQueryStrings(req,
boostParams);
boostQueries = null;
@@ -183,28 +128,92 @@
}
}
}
+ }
- /* * * Boosting Functions * * */
+ protected void addMainQuery(BooleanQuery query, SolrParams solrParams)
throws ParseException {
+ Map<String, Float> phraseFields =
SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.PF));
+ float tiebreaker = solrParams.getFloat(DisMaxParams.TIE, 0.0f);
- String[] boostFuncs = solrParams.getParams(DisMaxParams.BF);
- if (null != boostFuncs && 0 != boostFuncs.length) {
- for (String boostFunc : boostFuncs) {
- if (null == boostFunc || "".equals(boostFunc)) continue;
- Map<String, Float> ff = SolrPluginUtils.parseFieldBoosts(boostFunc);
- for (String f : ff.keySet()) {
- Query fq = subQuery(f, FunctionQParserPlugin.NAME).parse();
- Float b = ff.get(f);
- if (null != b) {
- fq.setBoost(b);
- }
- query.add(fq, BooleanClause.Occur.SHOULD);
- }
+ /* a parser for dealing with user input, which will convert
+ * things to DisjunctionMaxQueries
+ */
+ SolrPluginUtils.DisjunctionMaxQueryParser up = getParser(queryFields,
DisMaxParams.QS, solrParams, tiebreaker);
+
+ /* for parsing sloppy phrases using DisjunctionMaxQueries */
+ SolrPluginUtils.DisjunctionMaxQueryParser pp = getParser(phraseFields,
DisMaxParams.PS, solrParams, tiebreaker);
+
+ /* * * Main User Query * * */
+ parsedUserQuery = null;
+ String userQuery = getString();
+ altUserQuery = null;
+ if (userQuery == null || userQuery.trim().length() < 1) {
+ // If no query is specified, we may have an alternate
+ altUserQuery = getAlternateUserQuery(solrParams);
+ query.add(altUserQuery, BooleanClause.Occur.MUST);
+ } else {
+ // There is a valid query string
+ userQuery =
SolrPluginUtils.partialEscape(SolrPluginUtils.stripUnbalancedQuotes(userQuery)).toString();
+ userQuery = SolrPluginUtils.stripIllegalOperators(userQuery).toString();
+
+ parsedUserQuery = getUserQuery(userQuery, up, solrParams);
+ query.add(parsedUserQuery, BooleanClause.Occur.MUST);
+
+ Query phrase = getPhraseQuery(userQuery, pp);
+ if (null != phrase) {
+ query.add(phrase, BooleanClause.Occur.SHOULD);
}
}
+ }
+
+ protected Query getAlternateUserQuery(SolrParams solrParams) throws
ParseException {
+ String altQ = solrParams.get(DisMaxParams.ALTQ);
+ if (altQ != null) {
+ QParser altQParser = subQuery(altQ, null);
+ return altQParser.parse();
+ } else {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "missing
query string");
+ }
+ }
+
+ protected Query getPhraseQuery(String userQuery,
SolrPluginUtils.DisjunctionMaxQueryParser pp) throws ParseException {
+ /* * * Add on Phrases for the Query * * */
+ /* build up phrase boosting queries */
+
+ /* if the userQuery already has some quotes, strip them out.
+ * we've already done the phrases they asked for in the main
+ * part of the query, this is to boost docs that may not have
+ * matched those phrases but do match looser phrases.
+ */
+ String userPhraseQuery = userQuery.replace("\"", "");
+ return pp.parse("\"" + userPhraseQuery + "\"");
+ }
+
+ protected Query getUserQuery(String userQuery,
SolrPluginUtils.DisjunctionMaxQueryParser up, SolrParams solrParams)
+ throws ParseException {
+ String minShouldMatch = solrParams.get(DisMaxParams.MM, "100%");
+ Query dis = up.parse(userQuery);
+ Query query = dis;
+
+ if (dis instanceof BooleanQuery) {
+ BooleanQuery t = new BooleanQuery();
+ SolrPluginUtils.flattenBooleanQuery(t, (BooleanQuery) dis);
+ SolrPluginUtils.setMinShouldMatch(t, minShouldMatch);
+ query = t;
+ }
return query;
}
+ protected SolrPluginUtils.DisjunctionMaxQueryParser getParser(Map<String,
Float> fields, String paramName,
+ SolrParams
solrParams, float tiebreaker) {
+ int slop = solrParams.getInt(paramName, 0);
+ SolrPluginUtils.DisjunctionMaxQueryParser parser = new
SolrPluginUtils.DisjunctionMaxQueryParser(req.getSchema(),
+ IMPOSSIBLE_FIELD_NAME);
+ parser.addAlias(IMPOSSIBLE_FIELD_NAME, tiebreaker, fields);
+ parser.setPhraseSlop(slop);
+ return parser;
+ }
+
@Override
public String[] getDefaultHighlightFields() {
return queryFields.keySet().toArray(new
String[queryFields.keySet().size()]);