blob: 57018418bc45c77ab5aea273b7b156d9948771e6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.handler.component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import junit.framework.Assert;
import org.apache.lucene.util.LuceneTestCase.Slow;
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;
import org.junit.Test;
/**
* Test for SuggestComponent's distributed querying
*
* @see org.apache.solr.handler.component.SuggestComponent
*/
@Slow
public class DistributedSuggestComponentTest extends BaseDistributedSearchTestCase {
public DistributedSuggestComponentTest() {
//Helpful for debugging
//fixShardCount=true;
//shardCount=2;
//stress=0;
//deadServers=null;
configString = "solrconfig-suggestercomponent.xml";
}
@BeforeClass
public static void beforeClass() throws Exception {
useFactory(null); // need an FS factory
}
@Override
public void validateControlData(QueryResponse control) throws Exception
{
NamedList<Object> nl = control.getResponse();
@SuppressWarnings("unchecked")
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");
}
}
@Test
public void test() throws Exception {
del("*:*");
index(id, "1", "cat", "This is another title", "price", "10", "weight", "10");
index(id, "2", "cat", "Yet another", "price", "15", "weight", "10");
index(id, "3", "cat", "Yet another title", "price", "20", "weight", "20");
index(id, "4", "cat", "suggestions for suggest", "price", "25", "weight", "20");
index(id, "5", "cat", "Red fox", "price", "30", "weight", "20");
index(id, "6", "cat", "Rad fox", "price", "35", "weight", "30");
index(id, "7", "cat", "example data", "price", "40", "weight", "30");
index(id, "8", "cat", "example inputdata", "price", "45", "weight", "30");
index(id, "9", "cat", "blah in blah", "price", "50", "weight", "40");
index(id, "10", "cat", "another blah in blah", "price", "55", "weight", "40");
commit();
handle.clear();
handle.put("timestamp", SKIPVAL);
handle.put("maxScore", SKIPVAL);
handle.put("response", SKIP);
String requestHandlerName = "/suggest";
String docDictName = "suggest_fuzzy_doc_dict";
String docExprDictName = "suggest_fuzzy_doc_expr_dict";
//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
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"));
query(buildRequest("Yet", false, requestHandlerName, dictionaryName, docExprDictName, count, "2"));
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<>();
if(useSuggestQ) {
params.add("suggest.q");
} else {
params.add("q");
}
params.add(q);
params.add("qt");
params.add(handlerName);
params.add("shards.qt");
params.add(handlerName);
if(addlParams!=null) {
params.addAll(Arrays.asList(addlParams));
}
return params.toArray(new Object[params.size()]);
}
}