You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2012/06/17 05:45:02 UTC

svn commit: r1351046 - in /lucene/dev/branches/branch_4x: ./ solr/ solr/core/ solr/core/src/java/org/apache/solr/schema/ solr/core/src/java/org/apache/solr/search/ solr/core/src/test/org/apache/solr/search/

Author: dsmiley
Date: Sun Jun 17 03:45:01 2012
New Revision: 1351046

URL: http://svn.apache.org/viewvc?rev=1351046&view=rev
Log:
SOLR-3534 dismax should consult 'df' as a default for 'qf' and throw an exception when none set

Modified:
    lucene/dev/branches/branch_4x/   (props changed)
    lucene/dev/branches/branch_4x/solr/   (props changed)
    lucene/dev/branches/branch_4x/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_4x/solr/core/   (props changed)
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/DisMaxQParser.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/QueryParsing.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SurroundQParserPlugin.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java

Modified: lucene/dev/branches/branch_4x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/CHANGES.txt?rev=1351046&r1=1351045&r2=1351046&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/solr/CHANGES.txt Sun Jun 17 03:45:01 2012
@@ -651,6 +651,10 @@ Other Changes
   field can no longer be populated via <copyField/> or <field default=...>
   in the schema.xml.
 
+* SOLR-3534: The Dismax and eDismax query parsers will fall back on the 'df' parameter
+  when 'qf' is absent.  And if neither is present nor the schema default search field
+  then an exception will be thrown now. (dsmiley)
+
 Documentation
 ----------------------
 
@@ -697,6 +701,9 @@ Upgrading from Solr 3.5
   are strongly advised that they should re-index as document signatures may 
   have now changed. (see SOLR-3200 & SOLR-3226 for details)
 
+* SOLR-2724: Specifying <defaultSearchField> and <solrQueryParser defaultOperator="..."/> in
+  schema.xml is now considered deprecated.  Instead you are encouraged to specify these via the "df"
+  and "q.op" parameters in your request handler definition.  (David Smiley)
 
 New Features
 ----------------------

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java?rev=1351046&r1=1351045&r2=1351046&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java Sun Jun 17 03:45:01 2012
@@ -211,7 +211,9 @@ public final class IndexSchema {
 
   
   /**
-   * Name of the default search field specified in the schema file
+   * Name of the default search field specified in the schema file.
+   * <br/><b>Note:</b>Avoid calling this, try to use this method so that the 'df' param is consulted as an override:
+   * {@link org.apache.solr.search.QueryParsing#getDefaultField(IndexSchema, String)}
    */
   public String getDefaultSearchFieldName() {
     return defaultSearchFieldName;
@@ -438,7 +440,7 @@ public final class IndexSchema {
 
     node = (Node) xpath.evaluate("/schema/defaultSearchField/text()", document, XPathConstants.NODE);
     if (node==null) {
-      log.warn("no default search field specified in schema.");
+      log.debug("no default search field specified in schema.");
     } else {
       defaultSearchFieldName=node.getNodeValue().trim();
       // throw exception if specified, but not found or not indexed
@@ -449,7 +451,7 @@ public final class IndexSchema {
           throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, msg );
         }
       }
-      log.info("default search field is "+defaultSearchFieldName);
+      log.info("default search field in schema is "+defaultSearchFieldName);
     }
 
     node = (Node) xpath.evaluate("/schema/solrQueryParser/@defaultOperator", document, XPathConstants.NODE);

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/DisMaxQParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/DisMaxQParser.java?rev=1351046&r1=1351045&r2=1351046&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/DisMaxQParser.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/DisMaxQParser.java Sun Jun 17 03:45:01 2012
@@ -21,6 +21,7 @@ import org.apache.lucene.queryparser.cla
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.Query;
+import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.common.params.DisMaxParams;
 import org.apache.solr.common.params.SolrParams;
@@ -63,6 +64,23 @@ public class DisMaxQParser extends QPars
                       op.equals(QueryParser.Operator.AND) ? "100%" : "0%");
   }
 
+  /**
+   * Uses {@link SolrPluginUtils#parseFieldBoosts(String)} with the 'qf' parameter. Falls back to the 'df' parameter
+   * or {@link org.apache.solr.schema.IndexSchema#getDefaultSearchFieldName()}.
+   */
+  public static Map<String, Float> parseQueryFields(final IndexSchema indexSchema, final SolrParams solrParams)
+      throws ParseException {
+    Map<String, Float> queryFields = SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.QF));
+    if (queryFields.isEmpty()) {
+      String df = QueryParsing.getDefaultField(indexSchema, solrParams.get(CommonParams.DF));
+      if (df == null) {
+        throw new ParseException("Neither "+DisMaxParams.QF+", "+CommonParams.DF +", nor the default search field are present.");
+      }
+      queryFields.put(df, 1.0f);
+    }
+    return queryFields;
+  }
+
   public DisMaxQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
     super(qstr, localParams, params, req);
   }
@@ -81,10 +99,7 @@ public class DisMaxQParser extends QPars
   public Query parse() throws ParseException {
     SolrParams solrParams = SolrParams.wrapDefaults(localParams, params);
 
-    queryFields = SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.QF));
-    if (0 == queryFields.size()) {
-      queryFields.put(req.getSchema().getDefaultSearchFieldName(), 1.0f);
-    }
+    queryFields = parseQueryFields(req.getSchema(), solrParams);
     
     /* the main query we will execute.  we disable the coord because
      * this query is an artificial construct

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java?rev=1351046&r1=1351045&r2=1351046&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java Sun Jun 17 03:45:01 2012
@@ -133,10 +133,7 @@ class ExtendedDismaxQParser extends QPar
 
     userFields = new UserFields(U.parseFieldBoosts(solrParams.getParams(DMP.UF)));
     
-    queryFields = SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.QF));
-    if (0 == queryFields.size()) {
-      queryFields.put(req.getSchema().getDefaultSearchFieldName(), 1.0f);
-    }
+    queryFields = DisMaxQParser.parseQueryFields(req.getSchema(), solrParams);
     
     // Boosted phrase of the full query string
     List<FieldParams> phraseFields = 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/QueryParsing.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/QueryParsing.java?rev=1351046&r1=1351045&r2=1351046&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/QueryParsing.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/QueryParsing.java Sun Jun 17 03:45:01 2012
@@ -39,8 +39,6 @@ import org.apache.lucene.util.CharsRef;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
@@ -72,7 +70,7 @@ public class QueryParsing {
 
 
   /**
-   * Returns the "prefered" default operator for use by Query Parsers, 
+   * Returns the "preferred" default operator for use by Query Parsers,
    * based on the settings in the IndexSchema which may be overridden using 
    * an optional String override value.
    *
@@ -86,6 +84,15 @@ public class QueryParsing {
     return "AND".equals(val) ? QueryParser.Operator.AND : QueryParser.Operator.OR;
   }
 
+  /**
+   * Returns the effective default field based on the 'df' param or
+   * hardcoded schema default.  May be null if either exists specified.
+   * @see org.apache.solr.common.params.CommonParams#DF
+   * @see org.apache.solr.schema.IndexSchema#getDefaultSearchFieldName
+   */
+  public static String getDefaultField(final IndexSchema s, final String df) {
+    return df != null ? df : s.getDefaultSearchFieldName();
+  }
 
   // note to self: something needs to detect infinite recursion when parsing queries
   public static int parseLocalParams(String txt, int start, Map<String, String> target, SolrParams params) throws ParseException {

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SurroundQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SurroundQParserPlugin.java?rev=1351046&r1=1351045&r2=1351046&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SurroundQParserPlugin.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SurroundQParserPlugin.java Sun Jun 17 03:45:01 2012
@@ -103,12 +103,8 @@ class SurroundQParser extends QParser {
     // so what do we do with the SrndQuery ??
     // processing based on example in LIA Ch 9
 
-    String defaultField = getParam(CommonParams.DF);
-    if (defaultField == null) {
-      defaultField = getReq().getSchema().getDefaultSearchFieldName();
-    }
-
     BasicQueryFactory bqFactory = new BasicQueryFactory(this.maxBasicQueries);
+    String defaultField = QueryParsing.getDefaultField(getReq().getSchema(),getParam(CommonParams.DF));
     Query lquery = sq.makeLuceneQueryField(defaultField, bqFactory);
     return lquery;
   }

Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java?rev=1351046&r1=1351045&r2=1351046&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java Sun Jun 17 03:45:01 2012
@@ -123,6 +123,11 @@ public class TestExtendedDismaxParser ex
                "q","100"), oner
     );
 
+    assertQ("qf defaults to df",
+        req("defType", "edismax", "df", "trait_ss",
+        "q","Tool"), twor
+    );
+
    assertQ("qf defaults to defaultSearchField"
            , req( "defType", "edismax"
                  ,"q","op")