mirror of https://github.com/apache/lucene.git
SOLR-8104: Config API does not work for spellchecker
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1705858 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a8d08f8247
commit
155f5a5dad
|
@ -217,6 +217,9 @@ Bug Fixes
|
|||
|
||||
* SOLR-8077: Replication can still cause index corruption. (Mark Miller)
|
||||
|
||||
* SOLR-8104: Config API does not work for spellchecker (noble)
|
||||
|
||||
|
||||
Optimizations
|
||||
----------------------
|
||||
|
||||
|
|
|
@ -648,42 +648,18 @@ public class SpellCheckComponent extends SearchComponent implements SolrCoreAwar
|
|||
boolean hasDefault = false;
|
||||
for (int i = 0; i < initParams.size(); i++) {
|
||||
if (initParams.getName(i).equals("spellchecker")) {
|
||||
NamedList spellchecker = (NamedList) initParams.getVal(i);
|
||||
String className = (String) spellchecker.get("classname");
|
||||
// TODO: this is a little bit sneaky: warn if class isnt supplied
|
||||
// so that it's mandatory in a future release?
|
||||
if (className == null)
|
||||
className = IndexBasedSpellChecker.class.getName();
|
||||
SolrResourceLoader loader = core.getResourceLoader();
|
||||
SolrSpellChecker checker = loader.newInstance(className, SolrSpellChecker.class);
|
||||
if (checker != null) {
|
||||
String dictionary = checker.init(spellchecker, core);
|
||||
if (dictionary != null) {
|
||||
boolean isDefault = dictionary.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME);
|
||||
if (isDefault == true && hasDefault == false){
|
||||
hasDefault = true;
|
||||
} else if (isDefault == true && hasDefault == true){
|
||||
throw new RuntimeException("More than one dictionary is missing name.");
|
||||
}
|
||||
spellCheckers.put(dictionary, checker);
|
||||
} else {
|
||||
if (hasDefault == false){
|
||||
spellCheckers.put(SolrSpellChecker.DEFAULT_DICTIONARY_NAME, checker);
|
||||
hasDefault = true;
|
||||
} else {
|
||||
throw new RuntimeException("More than one dictionary is missing name.");
|
||||
Object cfg = initParams.getVal(i);
|
||||
if (cfg instanceof NamedList) {
|
||||
addSpellChecker(core, hasDefault, (NamedList) cfg);
|
||||
} else if (cfg instanceof Map) {
|
||||
System.out.println("##mapspellchecker");//todo nocommit
|
||||
addSpellChecker(core, hasDefault, new NamedList((Map) cfg));
|
||||
} else if (cfg instanceof List) {
|
||||
for (Object o : (List) cfg) {
|
||||
if (o instanceof Map) {
|
||||
addSpellChecker(core, hasDefault, new NamedList((Map) o));
|
||||
}
|
||||
}
|
||||
// Register event listeners for this SpellChecker
|
||||
core.registerFirstSearcherListener(new SpellCheckerListener(core, checker, false, false));
|
||||
boolean buildOnCommit = Boolean.parseBoolean((String) spellchecker.get("buildOnCommit"));
|
||||
boolean buildOnOptimize = Boolean.parseBoolean((String) spellchecker.get("buildOnOptimize"));
|
||||
if (buildOnCommit || buildOnOptimize) {
|
||||
LOG.info("Registering newSearcher listener for spellchecker: " + checker.getDictionaryName());
|
||||
core.registerNewSearcherListener(new SpellCheckerListener(core, checker, buildOnCommit, buildOnOptimize));
|
||||
}
|
||||
} else {
|
||||
throw new RuntimeException("Can't load spell checker: " + className);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -711,6 +687,47 @@ public class SpellCheckComponent extends SearchComponent implements SolrCoreAwar
|
|||
}
|
||||
}
|
||||
|
||||
private boolean addSpellChecker(SolrCore core, boolean hasDefault, NamedList spellchecker) {
|
||||
String className = (String) spellchecker.get("classname");
|
||||
if (className == null) className = (String) spellchecker.get("class");
|
||||
// TODO: this is a little bit sneaky: warn if class isnt supplied
|
||||
// so that it's mandatory in a future release?
|
||||
if (className == null)
|
||||
className = IndexBasedSpellChecker.class.getName();
|
||||
SolrResourceLoader loader = core.getResourceLoader();
|
||||
SolrSpellChecker checker = loader.newInstance(className, SolrSpellChecker.class);
|
||||
if (checker != null) {
|
||||
String dictionary = checker.init(spellchecker, core);
|
||||
if (dictionary != null) {
|
||||
boolean isDefault = dictionary.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME);
|
||||
if (isDefault && !hasDefault) {
|
||||
hasDefault = true;
|
||||
} else if (isDefault && hasDefault) {
|
||||
throw new RuntimeException("More than one dictionary is missing name.");
|
||||
}
|
||||
spellCheckers.put(dictionary, checker);
|
||||
} else {
|
||||
if (!hasDefault) {
|
||||
spellCheckers.put(SolrSpellChecker.DEFAULT_DICTIONARY_NAME, checker);
|
||||
hasDefault = true;
|
||||
} else {
|
||||
throw new RuntimeException("More than one dictionary is missing name.");
|
||||
}
|
||||
}
|
||||
// Register event listeners for this SpellChecker
|
||||
core.registerFirstSearcherListener(new SpellCheckerListener(core, checker, false, false));
|
||||
boolean buildOnCommit = Boolean.parseBoolean((String) spellchecker.get("buildOnCommit"));
|
||||
boolean buildOnOptimize = Boolean.parseBoolean((String) spellchecker.get("buildOnOptimize"));
|
||||
if (buildOnCommit || buildOnOptimize) {
|
||||
LOG.info("Registering newSearcher listener for spellchecker: " + checker.getDictionaryName());
|
||||
core.registerNewSearcherListener(new SpellCheckerListener(core, checker, buildOnCommit, buildOnOptimize));
|
||||
}
|
||||
} else {
|
||||
throw new RuntimeException("Can't load spell checker: " + className);
|
||||
}
|
||||
return hasDefault;
|
||||
}
|
||||
|
||||
private static class SpellCheckerListener implements SolrEventListener {
|
||||
private final SolrCore core;
|
||||
private final SolrSpellChecker checker;
|
||||
|
|
|
@ -387,6 +387,28 @@ public class TestSolrConfigHandler extends RestTestBase {
|
|||
assertNotNull("no object /config/initParams : "+ TestBlobHandler.getAsString(map) , l);
|
||||
assertEquals( 1, l.size());
|
||||
assertEquals( "val", ((Map)l.get(0)).get("key") );
|
||||
|
||||
|
||||
payload = "{\n" +
|
||||
" 'add-searchcomponent': {\n" +
|
||||
" 'name': 'myspellcheck',\n" +
|
||||
" 'class': 'solr.SpellCheckComponent',\n" +
|
||||
" 'queryAnalyzerFieldType': 'text_general',\n" +
|
||||
" 'spellchecker': {\n" +
|
||||
" 'name': 'default',\n" +
|
||||
" 'field': '_text_',\n" +
|
||||
" 'class': 'solr.DirectSolrSpellChecker'\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
runConfigCommand(writeHarness, "/config?wt=json", payload);
|
||||
map = testForResponseElement(writeHarness,
|
||||
testServerBaseUrl,
|
||||
"/config?wt=json",
|
||||
cloudSolrClient,
|
||||
Arrays.asList("config", "searchComponent","myspellcheck", "spellchecker", "class"),
|
||||
"solr.DirectSolrSpellChecker",
|
||||
10);
|
||||
}
|
||||
|
||||
public static Map testForResponseElement(RestTestHarness harness,
|
||||
|
|
Loading…
Reference in New Issue