Index: oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java =================================================================== --- oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java (revision 1656019) +++ oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/FilterQueryParser.java (working copy) @@ -112,6 +112,15 @@ // TODO : this should not be always passed to avoid building the dictionary on each spellcheck request solrQuery.setParam("spellcheck.build", true); } + if ("/suggest".equals(requestHandlerString)) { + if ("term".equals(kv[0])) { + kv[0] = "suggest.q"; + } + solrQuery.setParam("suggest", true); + + // TODO : this should not be always passed to avoid building the dictionary on each suggest request + solrQuery.setParam("suggest.build", true); + } solrQuery.setParam(kv[0], kv[1]); } } @@ -303,7 +312,7 @@ private static boolean isSupportedHttpRequest(String nativeQueryString) { // the query string starts with ${supported-handler.selector}? - return nativeQueryString.matches("(spellcheck|mlt|query|select|get)\\\\?.*"); + return nativeQueryString.matches("(suggest|spellcheck|mlt|query|select|get)\\\\?.*"); } private static void setDefaults(SolrQuery solrQuery, OakSolrConfiguration configuration) { Index: oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java =================================================================== --- oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java (revision 1656019) +++ oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/query/SolrQueryIndex.java (working copy) @@ -16,11 +16,13 @@ */ package org.apache.jackrabbit.oak.plugins.index.solr.query; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Deque; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Set; import javax.annotation.CheckForNull; @@ -50,6 +52,8 @@ import org.apache.solr.client.solrj.response.SpellCheckResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; +import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.SimpleOrderedMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -259,18 +263,20 @@ SolrDocumentList docs = queryResponse.getResults(); - onRetrievedDocs(filter, docs); + if (docs != null) { + onRetrievedDocs(filter, docs); - if (log.isDebugEnabled()) { - log.debug("getting docs {}", docs); - } + if (log.isDebugEnabled()) { + log.debug("getting docs {}", docs); + } - for (SolrDocument doc : docs) { - SolrResultRow row = convertToRow(doc); - if (row != null) { - queue.add(row); + for (SolrDocument doc : docs) { + SolrResultRow row = convertToRow(doc); + if (row != null) { + queue.add(row); + } + lastDocToRecord = doc; } - lastDocToRecord = doc; } // handle spellcheck @@ -279,12 +285,30 @@ spellCheckResponse.getSuggestions().size() > 0) { SolrDocument fakeDoc = new SolrDocument(); for (SpellCheckResponse.Suggestion suggestion : spellCheckResponse.getSuggestions()) { - fakeDoc.addField("rep:spellcheck()", suggestion.getAlternatives()); + fakeDoc.addField(QueryImpl.REP_SPELLCHECK, suggestion.getAlternatives()); } queue.add(new SolrResultRow("/", 1.0, fakeDoc)); noDocs = true; } + // handle suggest + NamedList response = queryResponse.getResponse(); + Object suggestNode = response.get("suggest"); + if (suggestNode != null) { + // TODO : fix NamedList access + SolrDocument fakeDoc = new SolrDocument(); + for (Object value : ((LinkedHashMap) suggestNode).values()) { + Object val = ((SimpleOrderedMap) ((SimpleOrderedMap) value).getVal(0)).getVal(1); + if (val != null) { + for (Object t : ((ArrayList)val)) { + fakeDoc.addField(QueryImpl.REP_SUGGEST, ((SimpleOrderedMap) t).getVal(0)); + } + } + } + queue.add(new SolrResultRow("/", 1.0, fakeDoc)); + noDocs = true; + } + } catch (Exception e) { if (log.isWarnEnabled()) { log.warn("query via {} failed.", solrServer, e); Index: oak-solr-core/src/main/resources/solr/oak/conf/schema.xml =================================================================== --- oak-solr-core/src/main/resources/solr/oak/conf/schema.xml (revision 1656019) +++ oak-solr-core/src/main/resources/solr/oak/conf/schema.xml (working copy) @@ -104,7 +104,16 @@ + + + + + + + + + @@ -113,11 +122,13 @@ + + + - @@ -127,4 +138,6 @@ + + Index: oak-solr-core/src/main/resources/solr/oak/conf/solrconfig.xml =================================================================== --- oak-solr-core/src/main/resources/solr/oak/conf/solrconfig.xml (revision 1656019) +++ oak-solr-core/src/main/resources/solr/oak/conf/solrconfig.xml (working copy) @@ -854,6 +854,7 @@ mlt spellcheck + suggest @@ -1100,6 +1101,29 @@ --> + + + + default + FuzzyLookupFactory + DocumentDictionaryFactory + :suggest + :suggest-weight + string + + + + + + true + 10 + + + suggest + + + + - + + + - @@ -161,4 +170,6 @@ + + Index: oak-solr-core/src/test/resources/solr/oak/conf/solrconfig.xml =================================================================== --- oak-solr-core/src/test/resources/solr/oak/conf/solrconfig.xml (revision 1656019) +++ oak-solr-core/src/test/resources/solr/oak/conf/solrconfig.xml (working copy) @@ -810,6 +810,7 @@ mlt spellcheck + suggest @@ -1147,6 +1148,27 @@ --> + + + default + FuzzyLookupFactory + DocumentDictionaryFactory + :suggest + :suggest-weight + string + + + + + + true + 10 + + + suggest + + +