You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by sh...@apache.org on 2008/07/25 16:28:40 UTC

svn commit: r679816 - in /lucene/solr/trunk: ./ src/java/org/apache/solr/handler/component/ src/java/org/apache/solr/spelling/ src/test/org/apache/solr/handler/component/ src/test/org/apache/solr/spelling/

Author: shalin
Date: Fri Jul 25 07:28:39 2008
New Revision: 679816

URL: http://svn.apache.org/viewvc?rev=679816&view=rev
Log:
SOLR-648: SpellCheckComponent throws NullPointerException on using spellcheck.q request parameter after restarting Solr, if reload is called but build is not called.

Modified:
    lucene/solr/trunk/CHANGES.txt
    lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
    lucene/solr/trunk/src/java/org/apache/solr/spelling/AbstractLuceneSpellChecker.java
    lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java
    lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java
    lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java
    lucene/solr/trunk/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java
    lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java
    lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java

Modified: lucene/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Fri Jul 25 07:28:39 2008
@@ -486,6 +486,10 @@
 42. SOLR-616: SpellChecker accuracy configuration is not applied for FileBasedSpellChecker.
     Apply it for FileBasedSpellChecker and IndexBasedSpellChecker both.
     (shalin)
+    
+43. SOLR-648: SpellCheckComponent throws NullPointerException on using spellcheck.q request
+    parameter after restarting Solr, if reload is called but build is not called.
+    (Jonathan Lee, shalin)    
 
 Other Changes
  1. SOLR-135: Moved common classes to org.apache.solr.common and altered the

Modified: lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java Fri Jul 25 07:28:39 2008
@@ -246,7 +246,7 @@
           SolrResourceLoader loader = core.getResourceLoader();
           SolrSpellChecker checker = (SolrSpellChecker) loader.newInstance(className);
           if (checker != null) {
-            String dictionary = checker.init(spellchecker, loader);
+            String dictionary = checker.init(spellchecker, core);
             if (dictionary != null) {
               boolean isDefault = dictionary.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME);
               if (isDefault == true && hasDefault == false){

Modified: lucene/solr/trunk/src/java/org/apache/solr/spelling/AbstractLuceneSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/spelling/AbstractLuceneSpellChecker.java?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/spelling/AbstractLuceneSpellChecker.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/spelling/AbstractLuceneSpellChecker.java Fri Jul 25 07:28:39 2008
@@ -5,8 +5,10 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.logging.Logger;
 
 import org.apache.lucene.analysis.Token;
+import org.apache.lucene.analysis.WhitespaceAnalyzer;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.spell.Dictionary;
@@ -17,7 +19,8 @@
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.store.RAMDirectory;
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.schema.FieldType;
 
 
 /**
@@ -30,12 +33,16 @@
  * @since solr 1.3
  */
 public abstract class AbstractLuceneSpellChecker extends SolrSpellChecker {
+  public static final Logger LOG = Logger.getLogger(AbstractLuceneSpellChecker.class.getName());
+  
   public static final String SPELLCHECKER_ARG_NAME = "spellchecker";
   public static final String LOCATION = "sourceLocation";
   public static final String INDEX_DIR = "spellcheckIndexDir";
   public static final String ACCURACY = "accuracy";
   public static final String STRING_DISTANCE = "distanceMeasure";
+  public static final String FIELD_TYPE = "fieldType";
   protected String field;
+  protected String fieldTypeName;
   protected org.apache.lucene.search.spell.SpellChecker spellChecker;
 
   protected String sourceLocation;
@@ -50,14 +57,14 @@
   protected float accuracy = 0.5f;
   public static final String FIELD = "field";
 
-  public String init(NamedList config, SolrResourceLoader loader) {
-    super.init(config, loader);
+  public String init(NamedList config, SolrCore core) {
+    super.init(config, core);
     indexDir = (String) config.get(INDEX_DIR);
     String accuracy = (String) config.get(ACCURACY);
     //If indexDir is relative then create index inside core.getDataDir()
     if (indexDir != null)   {
       if (!new File(indexDir).isAbsolute()) {
-        indexDir = loader.getDataDir() + File.separator + indexDir;
+        indexDir = core.getDataDir() + File.separator + indexDir;
       }
     }
     sourceLocation = (String) config.get(LOCATION);
@@ -65,7 +72,7 @@
     String strDistanceName = (String)config.get(STRING_DISTANCE);
     StringDistance sd = null;
     if (strDistanceName != null) {
-      sd = (StringDistance) loader.newInstance(strDistanceName);
+      sd = (StringDistance) core.getResourceLoader().newInstance(strDistanceName);
       //TODO: Figure out how to configure options.  Where's Spring when you need it?  Or at least BeanUtils...
     } else {
       sd = new LevensteinDistance();
@@ -85,6 +92,18 @@
                 "Unparseable accuracy given for dictionary: " + name, e);
       }
     }
+    if (field != null && core.getSchema().getFieldTypeNoEx(field) != null)  {
+      analyzer = core.getSchema().getFieldType(field).getQueryAnalyzer();
+    }
+    fieldTypeName = (String) config.get(FIELD_TYPE);
+    if (core.getSchema().getFieldTypes().containsKey(fieldTypeName))  {
+      FieldType fieldType = core.getSchema().getFieldTypes().get(fieldTypeName);
+      analyzer = fieldType.getQueryAnalyzer();
+    }
+    if (analyzer == null)   {
+      LOG.info("Using WhitespaceAnalzyer for dictionary: " + name);
+      analyzer = new WhitespaceAnalyzer();
+    }
     return name;
   }
   
@@ -132,14 +151,11 @@
     return reader;
   }
 
-
   public void reload() throws IOException {
     spellChecker.setSpellIndex(index);
 
   }
 
-
-
   /**
    * Initialize the {@link #index} variable based on the {@link #indexDir}.  Does not actually create the spelling index.
    *

Modified: lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java Fri Jul 25 07:28:39 2008
@@ -38,7 +38,6 @@
 import org.apache.solr.util.HighFrequencyDictionary;
 import org.apache.solr.search.SolrIndexSearcher;
 
-
 /**
  * <p>
  * A spell checker implementation which can load words from a text 
@@ -51,17 +50,13 @@
 
   private static final Logger log = Logger.getLogger(FileBasedSpellChecker.class.getName());
 
-  public static final String FIELD_TYPE = "fieldType";
-
   public static final String SOURCE_FILE_CHAR_ENCODING = "characterEncoding";
 
-  private String fieldTypeName;
   private String characterEncoding;
   public static final String WORD_FIELD_NAME = "word";
 
-  public String init(NamedList config, SolrResourceLoader loader) {
-    super.init(config, loader);
-    fieldTypeName = (String) config.get(FIELD_TYPE);
+  public String init(NamedList config, SolrCore core) {
+    super.init(config, core);
     characterEncoding = (String) config.get(SOURCE_FILE_CHAR_ENCODING);
     return name;
   }
@@ -113,12 +108,7 @@
 
         dictionary = new HighFrequencyDictionary(IndexReader.open(ramDir),
                 WORD_FIELD_NAME, 0.0f);
-        analyzer = fieldType.getQueryAnalyzer();
       } else {
-        log.warning("No fieldType: " + fieldTypeName
-                + " found for dictionary: " + name + ".  Using WhitespaceAnalzyer.");
-        analyzer = new WhitespaceAnalyzer();
-
         // check if character encoding is defined
         if (characterEncoding == null) {
           dictionary = new PlainTextDictionary(loader.openResource(sourceLocation));

Modified: lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java Fri Jul 25 07:28:39 2008
@@ -50,8 +50,8 @@
   protected float threshold;
   protected IndexReader reader;
 
-  public String init(NamedList config, SolrResourceLoader loader) {
-    super.init(config, loader);
+  public String init(NamedList config, SolrCore core) {
+    super.init(config, core);
     threshold = config.get(THRESHOLD_TOKEN_FREQUENCY) == null ? 0.0f
             : (Float) config.get(THRESHOLD_TOKEN_FREQUENCY);
     initSourceReader();
@@ -80,8 +80,9 @@
         reader = this.reader;
       }
 
-
-      loadLuceneDictionary(core.getSchema(), reader);
+      // Create the dictionary
+      dictionary = new HighFrequencyDictionary(reader, field,
+          threshold);
       spellChecker.clearIndex();
       spellChecker.indexDictionary(dictionary);
 
@@ -101,17 +102,6 @@
     return result;
   }
 
-  @SuppressWarnings("unchecked")
-  private void loadLuceneDictionary(IndexSchema schema, IndexReader reader) {
-    // Create the dictionary
-    dictionary = new HighFrequencyDictionary(reader, field,
-            threshold);
-    // Get the field's analyzer
-    FieldType fieldType = schema.getFieldTypeNoEx(field);
-    analyzer = fieldType == null ? new WhitespaceAnalyzer()
-            : fieldType.getQueryAnalyzer();
-  }
-
   @Override
   public void reload() throws IOException {
     super.reload();

Modified: lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java Fri Jul 25 07:28:39 2008
@@ -21,7 +21,6 @@
 import org.apache.lucene.index.IndexReader;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.search.SolrIndexSearcher;
 
 import java.io.IOException;
@@ -41,7 +40,7 @@
   protected String name;
   protected Analyzer analyzer;
 
-  public String init(NamedList config, SolrResourceLoader loader){
+  public String init(NamedList config, SolrCore core){
     name = (String) config.get(DICTIONARY_NAME);
     if (name == null) {
       name = DEFAULT_DICTIONARY_NAME;

Modified: lucene/solr/trunk/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java Fri Jul 25 07:28:39 2008
@@ -18,6 +18,7 @@
 package org.apache.solr.handler.component;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -32,6 +33,7 @@
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrQueryResponse;
 import org.apache.solr.request.SolrRequestHandler;
+import org.apache.solr.spelling.AbstractLuceneSpellChecker;
 import org.apache.solr.spelling.IndexBasedSpellChecker;
 import org.apache.solr.util.AbstractSolrTestCase;
 
@@ -311,6 +313,41 @@
         "spellcheckerIndexDir was not created inside the configured value for dataDir folder as configured in solrconfig.xml",
         indexDir.exists());
   }
+  
+  public void testReloadOnStart() throws Exception {
+    assertU(adoc("id", "0", "lowerfilt", "This is a title"));
+    assertU(commit());
+    SolrQueryRequest request = req("qt", "spellCheckCompRH", "q", "*:*",
+        "spellcheck.q", "ttle", "spellcheck", "true", "spellcheck.dictionary",
+        "default", "spellcheck.build", "true");
+    assertQ(request, "//arr[@name='suggestion'][.='title']");
+
+    NamedList args = new NamedList();
+    NamedList spellchecker = new NamedList();
+    spellchecker.add(AbstractLuceneSpellChecker.DICTIONARY_NAME, "default");
+    spellchecker.add(AbstractLuceneSpellChecker.FIELD, "lowerfilt");
+    spellchecker.add(AbstractLuceneSpellChecker.INDEX_DIR, "spellchecker1");
+    args.add("spellchecker", spellchecker);
+
+    SpellCheckComponent checker = new SpellCheckComponent();
+    checker.init(args);
+    checker.inform(h.getCore());
+
+    request = req("qt", "spellCheckCompRH", "q", "*:*", "spellcheck.q", "ttle",
+        "spellcheck", "true", "spellcheck.dictionary", "default",
+        "spellcheck.reload", "true");
+    ResponseBuilder rb = new ResponseBuilder();
+    rb.req = request;
+    rb.rsp = new SolrQueryResponse();
+    rb.components = new ArrayList(h.getCore().getSearchComponents().values());
+    checker.prepare(rb);
+
+    try {
+      checker.process(rb);
+    } catch (NullPointerException e) {
+      fail("NullPointerException due to reload not initializing analyzers");
+    }
+  }
 
   // TODO: add more tests for various spelling options
 

Modified: lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java Fri Jul 25 07:28:39 2008
@@ -70,7 +70,7 @@
     indexDir.mkdirs();
     spellchecker.add(FileBasedSpellChecker.INDEX_DIR, indexDir.getAbsolutePath());
     SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core.getResourceLoader());
+    String dictName = checker.init(spellchecker, core);
     assertTrue(dictName + " is not equal to " + "external", dictName.equals("external") == true);
     checker.build(core, null);
 
@@ -108,7 +108,7 @@
     spellchecker.add(FileBasedSpellChecker.FIELD_TYPE, "teststop");
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
     SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core.getResourceLoader());
+    String dictName = checker.init(spellchecker, core);
     assertTrue(dictName + " is not equal to " + "external", dictName.equals("external") == true);
     checker.build(core, null);
 
@@ -149,7 +149,7 @@
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
 
     SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core.getResourceLoader());
+    String dictName = checker.init(spellchecker, core);
     assertTrue(dictName + " is not equal to " + "external", dictName.equals("external") == true);
     checker.build(core, null);
 

Modified: lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java?rev=679816&r1=679815&r2=679816&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java Fri Jul 25 07:28:39 2008
@@ -89,7 +89,7 @@
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
     SolrCore core = h.getCore();
 
-    String dictName = checker.init(spellchecker, core.getResourceLoader());
+    String dictName = checker.init(spellchecker, core);
     assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
             dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
     RefCounted<SolrIndexSearcher> holder = core.getSearcher();
@@ -162,7 +162,7 @@
     spellchecker.add(IndexBasedSpellChecker.FIELD, "title");
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
     SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core.getResourceLoader());
+    String dictName = checker.init(spellchecker, core);
     assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
             dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
     RefCounted<SolrIndexSearcher> holder = core.getSearcher();
@@ -218,7 +218,7 @@
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
     spellchecker.add(AbstractLuceneSpellChecker.STRING_DISTANCE, JaroWinklerDistance.class.getName());
     SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core.getResourceLoader());
+    String dictName = checker.init(spellchecker, core);
     assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
             dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
     RefCounted<SolrIndexSearcher> holder = core.getSearcher();
@@ -268,7 +268,7 @@
     spellchecker.add(IndexBasedSpellChecker.FIELD, "title");
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
     SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core.getResourceLoader());
+    String dictName = checker.init(spellchecker, core);
     assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
             dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
     RefCounted<SolrIndexSearcher> holder = core.getSearcher();