You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by an...@apache.org on 2014/11/05 01:45:45 UTC

svn commit: r1636788 - in /lucene/dev/branches/branch_5x: ./ lucene/ lucene/queries/ lucene/queries/src/java/org/apache/lucene/queries/mlt/ solr/ solr/core/ solr/core/src/java/org/apache/solr/search/mlt/ solr/core/src/test/org/apache/solr/search/mlt/

Author: anshum
Date: Wed Nov  5 00:45:44 2014
New Revision: 1636788

URL: http://svn.apache.org/r1636788
Log:
SOLR-6248: Fixing an exception in case of missing qf (merge from trunk)

Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/lucene/   (props changed)
    lucene/dev/branches/branch_5x/lucene/queries/   (props changed)
    lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/mlt/MoreLikeThis.java
    lucene/dev/branches/branch_5x/solr/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java

Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/mlt/MoreLikeThis.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/mlt/MoreLikeThis.java?rev=1636788&r1=1636787&r2=1636788&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/mlt/MoreLikeThis.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/mlt/MoreLikeThis.java Wed Nov  5 00:45:44 2014
@@ -591,7 +591,7 @@ public final class MoreLikeThis {
    * @param filteredDocument Document with field values extracted for selected fields.
    * @return More Like This query for the passed document.
    */
-  public Query like(Map<String, ArrayList<String>> filteredDocument) throws IOException {
+  public Query like(Map<String, Collection<Object>> filteredDocument) throws IOException {
     if (fieldNames == null) {
       // gather list of valid fields from lucene
       Collection<String> fields = MultiFields.getIndexedFields(ir);
@@ -754,16 +754,16 @@ public final class MoreLikeThis {
   }
 
 
-  private PriorityQueue<ScoreTerm> retrieveTerms(Map<String, ArrayList<String>> fields) throws 
+  private PriorityQueue<ScoreTerm> retrieveTerms(Map<String, Collection<Object>> fields) throws 
       IOException {
     HashMap<String,Int> termFreqMap = new HashMap();
     for (String fieldName : fieldNames) {
 
       for (String field : fields.keySet()) {
-        ArrayList<String> fieldValues = fields.get(field);
-        for(String fieldValue:fieldValues) {
+        Collection<Object> fieldValues = fields.get(field);
+        for(Object fieldValue:fieldValues) {
           if (fieldValue != null) {
-            addTermFrequencies(new StringReader(fieldValue), termFreqMap,
+            addTermFrequencies(new StringReader(String.valueOf(fieldValue)), termFreqMap,
                 fieldName);
           }
         }

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java?rev=1636788&r1=1636787&r2=1636788&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java Wed Nov  5 00:45:44 2014
@@ -27,11 +27,15 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequestBase;
 import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.QParser;
 import org.apache.solr.search.QueryParsing;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -42,6 +46,8 @@ public class CloudMLTQParser extends QPa
     super(qstr, localParams, params, req);
   }
 
+  private static Logger log = LoggerFactory
+      .getLogger(CloudMLTQParser.class);
   public Query parse() {
     String id = localParams.get(QueryParsing.V);
     // Do a Real Time Get for the document
@@ -61,17 +67,27 @@ public class CloudMLTQParser extends QPa
     mlt.setAnalyzer(req.getSchema().getIndexAnalyzer());
 
     String[] qf = localParams.getParams("qf");
-    Map<String, ArrayList<String>> filteredDocument = new HashMap();
+    Map<String, Collection<Object>> filteredDocument = new HashMap();
 
     if (qf != null) {
       mlt.setFieldNames(qf);
       for (String field : qf) {
-        filteredDocument.put(field, (ArrayList<String>) doc.get(field));
+        filteredDocument.put(field, doc.getFieldValues(field));
       }
     } else {
+      Map<String, SchemaField> fields = req.getSchema().getFields();
+      ArrayList<String> fieldNames = new ArrayList();
       for (String field : doc.getFieldNames()) {
-        filteredDocument.put(field, (ArrayList<String>) doc.get(field));
+        // Only use fields that are stored and have an explicit analyzer.
+        // This makes sense as the query uses tf/idf/.. for query construction.
+        // We might want to relook and change this in the future though.
+        if(fields.get(field).stored() 
+            && fields.get(field).getType().isExplicitAnalyzer()) {
+          fieldNames.add(field);
+          filteredDocument.put(field, doc.getFieldValues(field));
+        }
       }
+      mlt.setFieldNames(fieldNames.toArray(new String[fieldNames.size()]));
     }
 
     try {

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java?rev=1636788&r1=1636787&r2=1636788&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java Wed Nov  5 00:45:44 2014
@@ -129,6 +129,20 @@ public class CloudMLTQParserTest extends
           compareParsedQueryStrings(expectedQueryString,
           actualParsedQueries.get(counter)));
     }
+
+    // Assert that {!mlt}id does not throw an exception i.e. implicitly, only fields that are stored + have explicit
+    // analyzer are used for MLT Query construction.
+    params = new ModifiableSolrParams();
+    params.set(CommonParams.Q, "{!mlt}20");
+
+    queryResponse = queryServer(params);
+    solrDocuments = queryResponse.getResults();
+    expectedIds = new int[]{18, 23, 13, 14, 20, 22, 19, 21, 15, 16};
+    i = 0;
+    for (SolrDocument solrDocument : solrDocuments) {
+      actualIds[i++] =  Integer.valueOf(String.valueOf(solrDocument.getFieldValue("id")));
+    }
+    assertArrayEquals(expectedIds, actualIds);
   }
   
   private boolean compareParsedQueryStrings(String expected, String actual) {