You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2014/01/10 18:59:23 UTC

svn commit: r1557206 - in /lucene/dev/trunk/solr: ./ core/src/java/org/apache/solr/handler/component/ core/src/java/org/apache/solr/spelling/suggest/ core/src/test-files/solr/collection1/conf/ core/src/test/org/apache/solr/handler/component/ core/src/t...

Author: rmuir
Date: Fri Jan 10 17:59:22 2014
New Revision: 1557206

URL: http://svn.apache.org/r1557206
Log:
SOLR-5529: add support for queries to use multiple suggesters in SuggestComponent

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterParams.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterResult.java
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-phrasesuggest.xml
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestFileDictionaryLookup.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestHighFrequencyDictionaryFactory.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Fri Jan 10 17:59:22 2014
@@ -142,6 +142,9 @@ New Features
 * SOLR-5463: new 'cursorMark' request param for deep paging of sorted result sets
   (sarowe, hossman)
 
+* SOLR-5529: Add support for queries to use multiple suggesters.
+  (Areek Zillur, Erick Erickson, via Robert Muir)
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java Fri Jan 10 17:59:22 2014
@@ -19,8 +19,11 @@ package org.apache.solr.handler.componen
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -144,21 +147,27 @@ public class SuggestComponent extends Se
     if (!params.getBool(COMPONENT_NAME, false)) {
       return;
     }
-
-    SolrSuggester suggester = getSuggester(params);
-    if (suggester == null) {
-      if (params.get(SUGGEST_DICT) != null) {
-        throw new IllegalArgumentException("No suggester named " + params.get(SUGGEST_DICT) +" was configured");
-      } else {
-        throw new IllegalArgumentException("No default suggester was configured");
-      }
+    
+    boolean buildAll = params.getBool(SUGGEST_BUILD_ALL, false);
+    boolean reloadAll = params.getBool(SUGGEST_RELOAD_ALL, false);
+    
+    final Collection<SolrSuggester> querysuggesters;
+    if (buildAll || reloadAll) {
+      querysuggesters = suggesters.values();
+    } else {
+      querysuggesters = getSuggesters(params);
     }
-    if (params.getBool(SUGGEST_BUILD, false)) {
-      suggester.build(rb.req.getCore(), rb.req.getSearcher());
-      rb.rsp.add("command", "build");
-    } else if (params.getBool(SUGGEST_RELOAD, false)) {
-      suggester.reload(rb.req.getCore(), rb.req.getSearcher());
-      rb.rsp.add("command", "reload");
+    
+    if (params.getBool(SUGGEST_BUILD, false) || buildAll) {
+      for (SolrSuggester suggester : querysuggesters) {
+        suggester.build(rb.req.getCore(), rb.req.getSearcher());
+      }
+      rb.rsp.add("command", (!buildAll) ? "build" : "buildAll");
+    } else if (params.getBool(SUGGEST_RELOAD, false) || reloadAll) {
+      for (SolrSuggester suggester : querysuggesters) {
+        suggester.reload(rb.req.getCore(), rb.req.getSearcher());
+      }
+      rb.rsp.add("command", (!reloadAll) ? "reload" : "reloadAll");
     }
   }
   
@@ -193,7 +202,19 @@ public class SuggestComponent extends Se
       return;
     }
     
-    SolrSuggester suggester = getSuggester(params);
+    boolean buildAll = params.getBool(SUGGEST_BUILD_ALL, false);
+    boolean reloadAll = params.getBool(SUGGEST_RELOAD_ALL, false);
+    Set<SolrSuggester> querySuggesters;
+    try {
+      querySuggesters = getSuggesters(params);
+    } catch(IllegalArgumentException ex) {
+      if (!buildAll && !reloadAll) {
+        throw ex;
+      } else {
+        querySuggesters = new HashSet<SolrSuggester>();
+      }
+    }
+    
     String query = params.get(SUGGEST_Q);
     if (query == null) {
       query = rb.getQueryString();
@@ -204,11 +225,14 @@ public class SuggestComponent extends Se
     
     if (query != null) {
       int count = params.getInt(SUGGEST_COUNT, 1);
-      SuggesterOptions options = new SuggesterOptions(new CharsRef(query), count); 
-      SuggesterResult suggesterResult = suggester.getSuggestions(options);
-      
-      NamedList<NamedList<Object>> namedListResult = toNamedList(suggesterResult);
-      rb.rsp.add(SuggesterResultLabels.SUGGEST, namedListResult);
+      SuggesterOptions options = new SuggesterOptions(new CharsRef(query), count);
+      Map<String, SimpleOrderedMap<NamedList<Object>>> namedListResults = 
+          new HashMap<String, SimpleOrderedMap<NamedList<Object>>>();
+      for (SolrSuggester suggester : querySuggesters) {
+        SuggesterResult suggesterResult = suggester.getSuggestions(options);
+        toNamedList(suggesterResult, namedListResults);
+      }
+      rb.rsp.add(SuggesterResultLabels.SUGGEST, namedListResults);
     }
   }
   
@@ -224,7 +248,6 @@ public class SuggestComponent extends Se
     int count = params.getInt(SUGGEST_COUNT, 1);
     
     List<SuggesterResult> suggesterResults = new ArrayList<SuggesterResult>();
-    NamedList<NamedList<Object>> namedListResult = null;
     
     // Collect Shard responses
     for (ShardRequest sreq : rb.finished) {
@@ -232,8 +255,8 @@ public class SuggestComponent extends Se
         NamedList<Object> resp;
         if((resp = srsp.getSolrResponse().getResponse()) != null) {
           @SuppressWarnings("unchecked")
-          NamedList<NamedList<Object>> namedList = 
-              (NamedList<NamedList<Object>>) resp.get(SuggesterResultLabels.SUGGEST);
+          Map<String, SimpleOrderedMap<NamedList<Object>>> namedList = 
+              (Map<String, SimpleOrderedMap<NamedList<Object>>>) resp.get(SuggesterResultLabels.SUGGEST);
           LOG.info(srsp.getShard() + " : " + namedList);
           suggesterResults.add(toSuggesterResult(namedList));
         }
@@ -242,9 +265,11 @@ public class SuggestComponent extends Se
     
     // Merge Shard responses
     SuggesterResult suggesterResult = merge(suggesterResults, count);
-    namedListResult = toNamedList(suggesterResult);
-      
-    rb.rsp.add(SuggesterResultLabels.SUGGEST, namedListResult);
+    Map<String, SimpleOrderedMap<NamedList<Object>>> namedListResults = 
+        new HashMap<String, SimpleOrderedMap<NamedList<Object>>>();
+    toNamedList(suggesterResult, namedListResults);
+    
+    rb.rsp.add(SuggesterResultLabels.SUGGEST, namedListResults);
   }
 
   /** 
@@ -254,33 +279,36 @@ public class SuggestComponent extends Se
    * weights
    * */
   private static SuggesterResult merge(List<SuggesterResult> suggesterResults, int count) {
-    if (suggesterResults.size() == 1) {
-      return suggesterResults.get(0);
-    }
     SuggesterResult result = new SuggesterResult();
     Set<String> allTokens = new HashSet<String>();
+    Set<String> suggesterNames = new HashSet<String>();
     
     // collect all tokens
     for (SuggesterResult shardResult : suggesterResults) {
-      allTokens.addAll(shardResult.getTokens());
+      for (String suggesterName : shardResult.getSuggesterNames()) {
+        allTokens.addAll(shardResult.getTokens(suggesterName));
+        suggesterNames.add(suggesterName);
+      }
     }
     
     // Get Top N for every token in every shard (using weights)
-    for (String token : allTokens) {
-      Lookup.LookupPriorityQueue resultQueue = new Lookup.LookupPriorityQueue(
-          count);
-      for (SuggesterResult shardResult : suggesterResults) {
-        List<LookupResult> suggests = shardResult.getLookupResult(token);
-        if (suggests == null) {
-          continue;
-        }
-        for (LookupResult res : suggests) {
-          resultQueue.insertWithOverflow(res);
+    for (String suggesterName : suggesterNames) {
+      for (String token : allTokens) {
+        Lookup.LookupPriorityQueue resultQueue = new Lookup.LookupPriorityQueue(
+            count);
+        for (SuggesterResult shardResult : suggesterResults) {
+          List<LookupResult> suggests = shardResult.getLookupResult(suggesterName, token);
+          if (suggests == null) {
+            continue;
+          }
+          for (LookupResult res : suggests) {
+            resultQueue.insertWithOverflow(res);
+          }
         }
+        List<LookupResult> sortedSuggests = new LinkedList<LookupResult>();
+        Collections.addAll(sortedSuggests, resultQueue.getResults());
+        result.add(suggesterName, token, sortedSuggests);
       }
-      List<LookupResult> sortedSuggests = new LinkedList<LookupResult>();
-      Collections.addAll(sortedSuggests, resultQueue.getResults());
-      result.add(token, sortedSuggests);
     }
     return result;
   }
@@ -315,72 +343,96 @@ public class SuggestComponent extends Se
     return sizeInBytes;
   }
   
-  private SolrSuggester getSuggester(SolrParams params) {
-    return suggesters.get(getSuggesterName(params));
+  private Set<SolrSuggester> getSuggesters(SolrParams params) {
+    Set<SolrSuggester> solrSuggesters = new HashSet<SolrSuggester>();
+    for(String suggesterName : getSuggesterNames(params)) {
+      SolrSuggester curSuggester = suggesters.get(suggesterName);
+      if (curSuggester != null) {
+        solrSuggesters.add(curSuggester);
+      } else {
+        throw new IllegalArgumentException("No suggester named " + suggesterName +" was configured");
+      }
+    }
+    if (solrSuggesters.size() == 0) {
+        throw new IllegalArgumentException("No default suggester was configured");
+    }
+    return solrSuggesters;
     
   }
   
-  private String getSuggesterName(SolrParams params){
-    return (params.get(SUGGEST_DICT) != null) ? 
-        (String)params.get(SUGGEST_DICT)
-        : DEFAULT_DICT_NAME;
-
+  private Set<String> getSuggesterNames(SolrParams params) {
+    Set<String> suggesterNames = new HashSet<String>();
+    String[] suggesterNamesFromParams = params.getParams(SUGGEST_DICT);
+    if (suggesterNamesFromParams == null) {
+      suggesterNames.add(DEFAULT_DICT_NAME);
+    } else {
+      for (String name : suggesterNamesFromParams) {
+        suggesterNames.add(name);
+      }
+    }
+    return suggesterNames;   
   }
   
   /** Convert {@link SuggesterResult} to NamedList for constructing responses */
-  private NamedList<NamedList<Object>> toNamedList(SuggesterResult suggesterResult) {
-    NamedList<NamedList<Object>> results = new SimpleOrderedMap<NamedList<Object>>();
-    for (String token : suggesterResult.getTokens()) {
-      SimpleOrderedMap<Object> suggestionBody = new SimpleOrderedMap<Object>();
-      List<LookupResult> lookupResults = suggesterResult.getLookupResult(token);
-      suggestionBody.add(SuggesterResultLabels.SUGGESTION_NUM_FOUND, lookupResults.size());
-      List<SimpleOrderedMap<Object>> suggestEntriesNamedList = new ArrayList<SimpleOrderedMap<Object>>();
-      for (LookupResult lookupResult : lookupResults) {
-        String suggestionString = lookupResult.key.toString();
-        long weight = lookupResult.value;
-        String payload = (lookupResult.payload != null) ? 
-            lookupResult.payload.utf8ToString()
-            : "";
-        
-        SimpleOrderedMap<Object> suggestEntryNamedList = new SimpleOrderedMap<Object>();
-        suggestEntryNamedList.add(SuggesterResultLabels.SUGGESTION_TERM, suggestionString);
-        suggestEntryNamedList.add(SuggesterResultLabels.SUGGESTION_WEIGHT, weight);
-        suggestEntryNamedList.add(SuggesterResultLabels.SUGGESTION_PAYLOAD, payload);
-        suggestEntriesNamedList.add(suggestEntryNamedList);
-        
+  private void toNamedList(SuggesterResult suggesterResult, Map<String, SimpleOrderedMap<NamedList<Object>>> resultObj) {
+    for(String suggesterName : suggesterResult.getSuggesterNames()) {
+      SimpleOrderedMap<NamedList<Object>> results = new SimpleOrderedMap<NamedList<Object>>();
+      for (String token : suggesterResult.getTokens(suggesterName)) {
+        SimpleOrderedMap<Object> suggestionBody = new SimpleOrderedMap<Object>();
+        List<LookupResult> lookupResults = suggesterResult.getLookupResult(suggesterName, token);
+        suggestionBody.add(SuggesterResultLabels.SUGGESTION_NUM_FOUND, lookupResults.size());
+        List<SimpleOrderedMap<Object>> suggestEntriesNamedList = new ArrayList<SimpleOrderedMap<Object>>();
+        for (LookupResult lookupResult : lookupResults) {
+          String suggestionString = lookupResult.key.toString();
+          long weight = lookupResult.value;
+          String payload = (lookupResult.payload != null) ? 
+              lookupResult.payload.utf8ToString()
+              : "";
+          
+          SimpleOrderedMap<Object> suggestEntryNamedList = new SimpleOrderedMap<Object>();
+          suggestEntryNamedList.add(SuggesterResultLabels.SUGGESTION_TERM, suggestionString);
+          suggestEntryNamedList.add(SuggesterResultLabels.SUGGESTION_WEIGHT, weight);
+          suggestEntryNamedList.add(SuggesterResultLabels.SUGGESTION_PAYLOAD, payload);
+          suggestEntriesNamedList.add(suggestEntryNamedList);
+          
+        }
+        suggestionBody.add(SuggesterResultLabels.SUGGESTIONS, suggestEntriesNamedList);
+        results.add(token, suggestionBody);
       }
-      suggestionBody.add(SuggesterResultLabels.SUGGESTIONS, suggestEntriesNamedList);
-      results.add(token, suggestionBody);
+      resultObj.put(suggesterName, results);
     }
-    return results;
   }
   
   /** Convert NamedList (suggester response) to {@link SuggesterResult} */
-  private SuggesterResult toSuggesterResult(NamedList<NamedList<Object>> suggestions) {
+  private SuggesterResult toSuggesterResult(Map<String, SimpleOrderedMap<NamedList<Object>>> suggestionsMap) {
     SuggesterResult result = new SuggesterResult();
-    if (suggestions == null) {
+    if (suggestionsMap == null) {
       return result;
     }
     // for each token
-    for(int i = 0; i < suggestions.size() ; i++) {
-      String tokenString = suggestions.getName(i);
-      List<LookupResult> lookupResults = new ArrayList<LookupResult>();
-      NamedList<Object> suggestion = (NamedList<Object>) suggestions.getVal(i);
-      // for each suggestion
-      for (int j = 0; j < suggestion.size(); j++) {
-        String property = suggestion.getName(j);
-        if (property.equals(SuggesterResultLabels.SUGGESTIONS)) {
-          @SuppressWarnings("unchecked")
-          List<NamedList<Object>> suggestionEntries = (List<NamedList<Object>>) suggestion.getVal(j);
-          for(NamedList<Object> suggestionEntry : suggestionEntries) {
-            String term = (String) suggestionEntry.get(SuggesterResultLabels.SUGGESTION_TERM);
-            Long weight = (Long) suggestionEntry.get(SuggesterResultLabels.SUGGESTION_WEIGHT);
-            String payload = (String) suggestionEntry.get(SuggesterResultLabels.SUGGESTION_PAYLOAD);
-            LookupResult res = new LookupResult(new CharsRef(term), weight, new BytesRef(payload));
-            lookupResults.add(res);
+    for(Map.Entry<String, SimpleOrderedMap<NamedList<Object>>> entry : suggestionsMap.entrySet()) {
+      String suggesterName = entry.getKey();
+      for (Iterator<Map.Entry<String, NamedList<Object>>> suggestionsIter = entry.getValue().iterator(); suggestionsIter.hasNext();) {
+        Map.Entry<String, NamedList<Object>> suggestions = suggestionsIter.next(); 
+        String tokenString = suggestions.getKey();
+        List<LookupResult> lookupResults = new ArrayList<LookupResult>();
+        NamedList<Object> suggestion = suggestions.getValue();
+        // for each suggestion
+        for (int j = 0; j < suggestion.size(); j++) {
+          String property = suggestion.getName(j);
+          if (property.equals(SuggesterResultLabels.SUGGESTIONS)) {
+            @SuppressWarnings("unchecked")
+            List<NamedList<Object>> suggestionEntries = (List<NamedList<Object>>) suggestion.getVal(j);
+            for(NamedList<Object> suggestionEntry : suggestionEntries) {
+              String term = (String) suggestionEntry.get(SuggesterResultLabels.SUGGESTION_TERM);
+              Long weight = (Long) suggestionEntry.get(SuggesterResultLabels.SUGGESTION_WEIGHT);
+              String payload = (String) suggestionEntry.get(SuggesterResultLabels.SUGGESTION_PAYLOAD);
+              LookupResult res = new LookupResult(new CharsRef(term), weight, new BytesRef(payload));
+              lookupResults.add(res);
+            }
           }
+          result.add(suggesterName, tokenString, lookupResults);
         }
-        result.add(tokenString, lookupResults);
       }
     }
     return result;

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java Fri Jan 10 17:59:22 2014
@@ -179,7 +179,7 @@ public class SolrSuggester {
     
     SuggesterResult res = new SuggesterResult();
     List<LookupResult> suggestions = lookup.lookup(options.token, false, options.count);
-    res.add(options.token.toString(), suggestions);
+    res.add(getName(), options.token.toString(), suggestions);
     return res;
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterParams.java?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterParams.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterParams.java Fri Jan 10 17:59:22 2014
@@ -47,10 +47,23 @@ public interface SuggesterParams {
    * Whether to build the index or not. Optional and false by default.
    */
   public static final String SUGGEST_BUILD = SUGGEST_PREFIX + "build";
+  
+  /**
+   * Whether to build the index or not for all suggesters in the component.
+   * Optional and false by default.
+   * This parameter does not need any suggest dictionary names to be specified
+   */
+  public static final String SUGGEST_BUILD_ALL = SUGGEST_PREFIX + "buildAll";
 
   /**
    * Whether to reload the index. Optional and false by default.
    */
   public static final String SUGGEST_RELOAD = SUGGEST_PREFIX + "reload";
 
+  /**
+   * Whether to reload the index or not for all suggesters in the component.
+   * Optional and false by default.
+   * This parameter does not need any suggest dictionary names to be specified
+   */
+  public static final String SUGGEST_RELOAD_ALL = SUGGEST_PREFIX + "reloadAll";
 }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterResult.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterResult.java?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterResult.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/SuggesterResult.java Fri Jan 10 17:59:22 2014
@@ -17,7 +17,9 @@ package org.apache.solr.spelling.suggest
  * limitations under the License.
  */
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -32,14 +34,19 @@ public class SuggesterResult {
   public SuggesterResult() {}
   
   /** token -> lookup results mapping*/
-  private Map<String, List<LookupResult>> suggestions = new HashMap<String, List<LookupResult>>();
+  private Map<String, Map<String, List<LookupResult>>> suggestionsMap = 
+      new HashMap<String, Map<String, List<LookupResult>>>();
 
   /** Add suggestion results for <code>token</code> */
-  public void add(String token, List<LookupResult> results) {
-    List<LookupResult> res = this.suggestions.get(token);
+  public void add(String suggesterName, String token, List<LookupResult> results) {
+    Map<String, List<LookupResult>> suggesterRes = this.suggestionsMap.get(suggesterName);
+    if (suggesterRes == null) {
+      this.suggestionsMap.put(suggesterName, new HashMap<String, List<LookupResult>>());
+    }
+    List<LookupResult> res = this.suggestionsMap.get(suggesterName).get(token);
     if (res == null) {
       res = results;
-      this.suggestions.put(token, res);
+      this.suggestionsMap.get(suggesterName).put(token, res);
     }
   }
   
@@ -48,15 +55,27 @@ public class SuggesterResult {
    * null can be returned, if there are no lookup results
    * for the <code>token</code>
    * */
-  public List<LookupResult> getLookupResult(String token) {
-    return this.suggestions.get(token);
+  public List<LookupResult> getLookupResult(String suggesterName, String token) {
+    return (this.suggestionsMap.containsKey(suggesterName))
+        ? this.suggestionsMap.get(suggesterName).get(token)
+        : new ArrayList<LookupResult>();
   }
   
   /**
    * Get the set of tokens that are present in the
    * instance
    */
-  public Set<String> getTokens() {
-    return this.suggestions.keySet();
+  public Set<String> getTokens(String suggesterName) {
+    return (this.suggestionsMap.containsKey(suggesterName))
+        ? this.suggestionsMap.get(suggesterName).keySet()
+        : new HashSet<String>();
+  }
+  
+  /**
+   * Get the set of suggesterNames for which this
+   * instance holds results
+   */
+  public Set<String> getSuggesterNames() {
+    return this.suggestionsMap.keySet();
   }
 }

Modified: lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-phrasesuggest.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-phrasesuggest.xml?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-phrasesuggest.xml (original)
+++ lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-phrasesuggest.xml Fri Jan 10 17:59:22 2014
@@ -254,7 +254,6 @@
   <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/fuzzy_suggest_analyzing_with_file_dict">
     <lst name="defaults">
       <str name="suggest">true</str>
-      <str name="suggest.dictionary">fuzzy_suggest_analyzing_with_file_dict</str>
     </lst>
     <arr name="components">
       <str>fuzzy_suggest_analyzing_with_file_dict</str>
@@ -264,7 +263,6 @@
   <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/fuzzy_suggest_analyzing_with_high_freq_dict">
     <lst name="defaults">
       <str name="suggest">true</str>
-      <str name="suggest.dictionary">fuzzy_suggest_analyzing_with_high_freq_dict</str>
     </lst>
     <arr name="components">
       <str>fuzzy_suggest_analyzing_with_high_freq_dict</str>

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java Fri Jan 10 17:59:22 2014
@@ -20,6 +20,7 @@ package org.apache.solr.handler.componen
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import junit.framework.Assert;
 
@@ -27,6 +28,7 @@ import org.apache.lucene.util.LuceneTest
 import org.apache.solr.BaseDistributedSearchTestCase;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.spelling.suggest.SuggesterParams;
 import org.junit.BeforeClass;
 
@@ -67,9 +69,10 @@ public class DistributedSuggestComponent
   {    
     NamedList<Object> nl = control.getResponse();
     @SuppressWarnings("unchecked")
-    NamedList<Object> sc = (NamedList<Object>) nl.get("suggest");
-    if(sc.size()==0) {
-      Assert.fail("Control data did not return any suggestions.");
+    Map<String, SimpleOrderedMap<NamedList<Object>>> sc = (Map<String, SimpleOrderedMap<NamedList<Object>>>) nl.get("suggest");
+    String command = (String) nl.get("command");
+    if(sc.size() == 0 && command == null) {
+      Assert.fail("Control data did not return any suggestions or execute any command");
     }
   } 
   
@@ -100,12 +103,17 @@ public class DistributedSuggestComponent
     
     //Shortcut names
     String build = SuggesterParams.SUGGEST_BUILD;
+    String buildAll = SuggesterParams.SUGGEST_BUILD_ALL;
     String count = SuggesterParams.SUGGEST_COUNT;
     String dictionaryName = SuggesterParams.SUGGEST_DICT;
     
-    //Build the suggest dictionary 
-    query(buildRequest("", true, requestHandlerName, build, "true", dictionaryName, docDictName));
-    query(buildRequest("", true, requestHandlerName, build, "true", dictionaryName, docExprDictName));
+    //Build the suggest dictionary
+    if (random().nextBoolean()) { // build all the suggesters in one go
+      query(buildRequest("", true, requestHandlerName, buildAll, "true"));
+    } else { // build suggesters individually
+      query(buildRequest("", true, requestHandlerName, build, "true", dictionaryName, docDictName));
+      query(buildRequest("", true, requestHandlerName, build, "true", dictionaryName, docExprDictName)); 
+    }
     
     //Test Basic Functionality
     query(buildRequest("exampel", false, requestHandlerName, dictionaryName, docDictName, count, "2"));
@@ -113,6 +121,9 @@ public class DistributedSuggestComponent
     query(buildRequest("blah", true, requestHandlerName, dictionaryName, docExprDictName, count, "2"));
     query(buildRequest("blah", true, requestHandlerName, dictionaryName, docDictName, count, "2"));
     
+    //Test multiSuggester
+    query(buildRequest("exampel", false, requestHandlerName, dictionaryName, docDictName, dictionaryName, docExprDictName, count, "2"));
+    
   }
   private Object[] buildRequest(String q, boolean useSuggestQ, String handlerName, String... addlParams) {
     List<Object> params = new ArrayList<Object>();
@@ -123,6 +134,7 @@ public class DistributedSuggestComponent
       params.add("q");
     }
     params.add(q);
+    
 
     params.add("qt");
     params.add(handlerName);

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentTest.java?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentTest.java Fri Jan 10 17:59:22 2014
@@ -66,11 +66,11 @@ public class SuggestComponentTest extend
         SuggesterParams.SUGGEST_BUILD, "true",
         SuggesterParams.SUGGEST_Q, "exampel",
         SuggesterParams.SUGGEST_COUNT, "2"),
-        "//lst[@name='suggest']/lst[@name='exampel']/int[@name='numFound'][.='2']",
-        "//lst[@name='suggest']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='example inputdata']",
-        "//lst[@name='suggest']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='45']",
-        "//lst[@name='suggest']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='example data']",
-        "//lst[@name='suggest']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='40']"
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/int[@name='numFound'][.='2']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='example inputdata']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='45']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='example data']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='40']"
         );
     
     assertQ(req("qt", rh, 
@@ -78,11 +78,11 @@ public class SuggestComponentTest extend
         SuggesterParams.SUGGEST_BUILD, "true",
         SuggesterParams.SUGGEST_Q, "Rad",
         SuggesterParams.SUGGEST_COUNT, "2"),
-        "//lst[@name='suggest']/lst[@name='Rad']/int[@name='numFound'][.='2']",
-        "//lst[@name='suggest']/lst[@name='Rad']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='Rad fox']",
-        "//lst[@name='suggest']/lst[@name='Rad']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='35']",
-        "//lst[@name='suggest']/lst[@name='Rad']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='Red fox']",
-        "//lst[@name='suggest']/lst[@name='Rad']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='30']"
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='Rad']/int[@name='numFound'][.='2']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='Rad']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='Rad fox']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='Rad']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='35']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='Rad']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='Red fox']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='Rad']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='30']"
         );
   }
   
@@ -93,11 +93,11 @@ public class SuggestComponentTest extend
         SuggesterParams.SUGGEST_BUILD, "true",
         SuggesterParams.SUGGEST_Q, "exampel",
         SuggesterParams.SUGGEST_COUNT, "2"),
-        "//lst[@name='suggest']/lst[@name='exampel']/int[@name='numFound'][.='2']",
-        "//lst[@name='suggest']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='example inputdata']",
-        "//lst[@name='suggest']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='120']",
-        "//lst[@name='suggest']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='example data']",
-        "//lst[@name='suggest']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='110']"
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/int[@name='numFound'][.='2']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='example inputdata']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='120']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='example data']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='110']"
         );
   }
   
@@ -108,11 +108,62 @@ public class SuggestComponentTest extend
         SuggesterParams.SUGGEST_BUILD, "true",
         SuggesterParams.SUGGEST_Q, "chn",
         SuggesterParams.SUGGEST_COUNT, "2"),
-        "//lst[@name='suggest']/lst[@name='chn']/int[@name='numFound'][.='2']",
-        "//lst[@name='suggest']/lst[@name='chn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
-        "//lst[@name='suggest']/lst[@name='chn']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='1']",
-        "//lst[@name='suggest']/lst[@name='chn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']",
-        "//lst[@name='suggest']/lst[@name='chn']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='1']"
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_file_based']/lst[@name='chn']/int[@name='numFound'][.='2']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_file_based']/lst[@name='chn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_file_based']/lst[@name='chn']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='1']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_file_based']/lst[@name='chn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_file_based']/lst[@name='chn']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='1']"
         );
   }
+  @Test
+  public void testMultiSuggester() throws Exception {
+    assertQ(req("qt", rh, 
+        SuggesterParams.SUGGEST_DICT, "suggest_fuzzy_doc_dict",
+        SuggesterParams.SUGGEST_DICT, "suggest_fuzzy_doc_expr_dict",
+        SuggesterParams.SUGGEST_BUILD, "true",
+        SuggesterParams.SUGGEST_Q, "exampel",
+        SuggesterParams.SUGGEST_COUNT, "2"),
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/int[@name='numFound'][.='2']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='example inputdata']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='45']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='example data']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='40']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/int[@name='numFound'][.='2']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='example inputdata']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[1]/long[@name='weight'][.='120']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='example data']",
+        "//lst[@name='suggest']/lst[@name='suggest_fuzzy_doc_expr_dict']/lst[@name='exampel']/arr[@name='suggestions']/lst[2]/long[@name='weight'][.='110']"
+        );
+  }
+  
+  @Test
+  public void testBuildAllSuggester() throws Exception {
+    assertQ(req("qt", rh, 
+        SuggesterParams.SUGGEST_BUILD_ALL, "true",
+        SuggesterParams.SUGGEST_Q, "exampel",
+        SuggesterParams.SUGGEST_COUNT, "2"),
+        "//str[@name='command'][.='buildAll']"
+        );
+    
+    assertQ(req("qt", rh, 
+        SuggesterParams.SUGGEST_BUILD_ALL, "true"),
+        "//str[@name='command'][.='buildAll']"
+        );
+  }
+  
+  @Test
+  public void testReloadAllSuggester() throws Exception {
+    assertQ(req("qt", rh, 
+        SuggesterParams.SUGGEST_RELOAD_ALL, "true",
+        SuggesterParams.SUGGEST_Q, "exampel",
+        SuggesterParams.SUGGEST_COUNT, "2"),
+        "//str[@name='command'][.='reloadAll']"
+        );
+    
+    assertQ(req("qt", rh, 
+        SuggesterParams.SUGGEST_RELOAD_ALL, "true"),
+        "//str[@name='command'][.='reloadAll']"
+        );
+  }
+  
 }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestFileDictionaryLookup.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestFileDictionaryLookup.java?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestFileDictionaryLookup.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestFileDictionaryLookup.java Fri Jan 10 17:59:22 2014
@@ -22,39 +22,40 @@ import org.junit.BeforeClass;
 
 public class TestFileDictionaryLookup extends SolrTestCaseJ4  {
   static final String REQUEST_URI = "/fuzzy_suggest_analyzing_with_file_dict";
+  static final String DICT_NAME = "fuzzy_suggest_analyzing_with_file_dict";
   
   @BeforeClass
   public static void beforeClass() throws Exception {
     initCore("solrconfig-phrasesuggest.xml","schema-phrasesuggest.xml");
-    assertQ(req("qt", REQUEST_URI, "q", "", SuggesterParams.SUGGEST_BUILD, "true"));
+    assertQ(req("qt", REQUEST_URI, "q", "", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_BUILD, "true"));
   }
   
   public void testDefault() throws Exception {
     
     // tests to demonstrate default maxEdit parameter (value: 1), control for testWithMaxEdit2
-    assertQ(req("qt", REQUEST_URI, "q", "chagn", SuggesterParams.SUGGEST_COUNT, "3"),
-      "//lst[@name='suggest']/lst[@name='chagn']/int[@name='numFound'][.='2']",
-      "//lst[@name='suggest']/lst[@name='chagn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
-      "//lst[@name='suggest']/lst[@name='chagn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']"
+    assertQ(req("qt", REQUEST_URI, "q", "chagn", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagn']/int[@name='numFound'][.='2']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']"
       );
     
-    assertQ(req("qt", REQUEST_URI, "q", "chacn", SuggesterParams.SUGGEST_COUNT, "3"),
-      "//lst[@name='suggest']/lst[@name='chacn']/int[@name='numFound'][.='2']",
-      "//lst[@name='suggest']/lst[@name='chacn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
-      "//lst[@name='suggest']/lst[@name='chacn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']"
+    assertQ(req("qt", REQUEST_URI, "q", "chacn", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chacn']/int[@name='numFound'][.='2']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chacn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chacn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']"
       );
     
-    assertQ(req("qt", REQUEST_URI, "q", "chagr", SuggesterParams.SUGGEST_COUNT, "3"),
-      "//lst[@name='suggest']/lst[@name='chagr']/int[@name='numFound'][.='1']",
-      "//lst[@name='suggest']/lst[@name='chagr']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='charge']"
+    assertQ(req("qt", REQUEST_URI, "q", "chagr", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagr']/int[@name='numFound'][.='1']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagr']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='charge']"
       );
     
-    assertQ(req("qt", REQUEST_URI, "q", "chanr", SuggesterParams.SUGGEST_COUNT, "3"),
-    "//lst[@name='suggest']/lst[@name='chanr']/int[@name='numFound'][.='3']"
+    assertQ(req("qt", REQUEST_URI, "q", "chanr", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+    "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chanr']/int[@name='numFound'][.='3']"
     );
     
-    assertQ(req("qt", REQUEST_URI, "q", "cyhnce", SuggesterParams.SUGGEST_COUNT, "3"),
-    "//lst[@name='suggest']/lst[@name='cyhnce']/int[@name='numFound'][.='0']"
+    assertQ(req("qt", REQUEST_URI, "q", "cyhnce", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+    "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='cyhnce']/int[@name='numFound'][.='0']"
     );
   }
 }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestHighFrequencyDictionaryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestHighFrequencyDictionaryFactory.java?rev=1557206&r1=1557205&r2=1557206&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestHighFrequencyDictionaryFactory.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/spelling/suggest/TestHighFrequencyDictionaryFactory.java Fri Jan 10 17:59:22 2014
@@ -23,6 +23,7 @@ import org.junit.BeforeClass;
 public class TestHighFrequencyDictionaryFactory extends SolrTestCaseJ4  {
   
   static final String REQUEST_URI = "/fuzzy_suggest_analyzing_with_high_freq_dict";
+  static final String DICT_NAME = "fuzzy_suggest_analyzing_with_high_freq_dict";
 
   @BeforeClass
   public static void beforeClass() throws Exception {
@@ -39,36 +40,36 @@ public class TestHighFrequencyDictionary
             "stext", "chance"));
 
     assertU(commit());
-    assertQ(req("qt", REQUEST_URI, "q", "", SuggesterParams.SUGGEST_BUILD, "true"));
+    assertQ(req("qt", REQUEST_URI, "q", "", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_BUILD, "true"));
   }
   
   
   public void testDefault() throws Exception {
     
  // tests to demonstrate default maxEdit parameter (value: 1), control for testWithMaxEdit2
-    assertQ(req("qt", REQUEST_URI, "q", "chagn", SuggesterParams.SUGGEST_COUNT, "3"),
-      "//lst[@name='suggest']/lst[@name='chagn']/int[@name='numFound'][.='2']",
-      "//lst[@name='suggest']/lst[@name='chagn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
-      "//lst[@name='suggest']/lst[@name='chagn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']"
+    assertQ(req("qt", REQUEST_URI, "q", "chagn", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagn']/int[@name='numFound'][.='2']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']"
       );
     
-    assertQ(req("qt", REQUEST_URI, "q", "chacn", SuggesterParams.SUGGEST_COUNT, "3"),
-      "//lst[@name='suggest']/lst[@name='chacn']/int[@name='numFound'][.='2']",
-      "//lst[@name='suggest']/lst[@name='chacn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
-      "//lst[@name='suggest']/lst[@name='chacn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']"
+    assertQ(req("qt", REQUEST_URI, "q", "chacn", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chacn']/int[@name='numFound'][.='2']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chacn']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='chance']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chacn']/arr[@name='suggestions']/lst[2]/str[@name='term'][.='change']"
       );
     
-    assertQ(req("qt", REQUEST_URI, "q", "chagr", SuggesterParams.SUGGEST_COUNT, "3"),
-      "//lst[@name='suggest']/lst[@name='chagr']/int[@name='numFound'][.='1']",
-      "//lst[@name='suggest']/lst[@name='chagr']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='charge']"
+    assertQ(req("qt", REQUEST_URI, "q", "chagr", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagr']/int[@name='numFound'][.='1']",
+      "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chagr']/arr[@name='suggestions']/lst[1]/str[@name='term'][.='charge']"
       );
     
-    assertQ(req("qt", REQUEST_URI, "q", "chanr", SuggesterParams.SUGGEST_COUNT, "3"),
-    "//lst[@name='suggest']/lst[@name='chanr']/int[@name='numFound'][.='3']"
+    assertQ(req("qt", REQUEST_URI, "q", "chanr", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+    "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='chanr']/int[@name='numFound'][.='3']"
     );
     
-    assertQ(req("qt", REQUEST_URI, "q", "cyhnce", SuggesterParams.SUGGEST_COUNT, "3"),
-    "//lst[@name='suggest']/lst[@name='cyhnce']/int[@name='numFound'][.='0']"
+    assertQ(req("qt", REQUEST_URI, "q", "cyhnce", SuggesterParams.SUGGEST_DICT, DICT_NAME, SuggesterParams.SUGGEST_COUNT, "3"),
+    "//lst[@name='suggest']/lst[@name='"+ DICT_NAME +"']/lst[@name='cyhnce']/int[@name='numFound'][.='0']"
     );
   }
 }