Skip to content

Commit

Permalink
added search spelling suggestions (UI needs work)
Browse files Browse the repository at this point in the history
  • Loading branch information
pdurbin committed Dec 10, 2013
1 parent 2fecf68 commit 60e640b
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 7 deletions.
6 changes: 5 additions & 1 deletion scripts/search/search
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
#!/bin/sh
curl 'http://localhost:8080/api/search?q=*'
if [ -z "$1" ]; then
curl 'http://localhost:8080/api/search?q=*'
else
curl "http://localhost:8080/api/search?$1"
fi
5 changes: 5 additions & 0 deletions scripts/search/spellcheck
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/sh
# output:
# "hits",1,
# "misspellingsAndCorrections",["datvrse","dataverse"]
curl -s 'http://localhost:8983/solr/spell?spellcheck=true&wt=json&indent=true&q=datvrse'
20 changes: 18 additions & 2 deletions src/main/java/edu/harvard/iq/dataverse/SearchPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.view.ViewScoped;
Expand All @@ -18,6 +19,7 @@ public class SearchPage implements java.io.Serializable {
private List<Dataset> datasets = new ArrayList<>();
private List<DataverseUser> dataverseUsers = new ArrayList<>();
private List<DataFile> dataFiles = new ArrayList<>();
private List<String> spelling_alternatives = new ArrayList<>();

@EJB
SearchServiceBean searchService;
Expand All @@ -39,14 +41,20 @@ public void search() {
datasets = new ArrayList();

query = query == null ? "*" : query;
List<SolrSearchResult> searchResults = searchService.search(query);
SolrQueryResponse solrQueryResponse = searchService.search(query);
List<SolrSearchResult> searchResults = solrQueryResponse.getSolrSearchResults();
for (Map.Entry<String, List<String>> entry : solrQueryResponse.getSpellingSuggestionsByToken().entrySet()) {
spelling_alternatives.add(entry.getValue().toString());
}
for (SolrSearchResult searchResult : searchResults) {
String type = searchResult.getType();
switch (type) {
case "dataverses":
Dataverse dataverse = dataverseService.find(searchResult.getEntityId());
if (searchResult.getHighlightSnippets() != null) {
/** @todo when does long description truncate? */
/**
* @todo when does long description truncate?
*/
dataverse.setDescription(searchResult.getHighlightSnippets().get(0));
}
dataverses.add(dataverse);
Expand Down Expand Up @@ -124,4 +132,12 @@ public void setDataFiles(List<DataFile> dataFiles) {
this.dataFiles = dataFiles;
}

public List<String> getSpelling_alternatives() {
return spelling_alternatives;
}

public void setSpelling_alternatives(List<String> spelling_alternatives) {
this.spelling_alternatives = spelling_alternatives;
}

}
21 changes: 18 additions & 3 deletions src/main/java/edu/harvard/iq/dataverse/SearchServiceBean.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
import edu.harvard.iq.dataverse.api.SearchFields;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.inject.Named;
Expand All @@ -13,6 +15,7 @@
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.SpellCheckResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;

Expand All @@ -28,7 +31,7 @@ public class SearchServiceBean {

private static final Logger logger = Logger.getLogger(SearchServiceBean.class.getCanonicalName());

public List<SolrSearchResult> search(String queryFromUser) {
public SolrQueryResponse search(String queryFromUser) {
/**
* @todo make "localhost" and port number a config option
*/
Expand All @@ -37,6 +40,7 @@ public List<SolrSearchResult> search(String queryFromUser) {
solrQuery.setQuery(queryFromUser);
solrQuery.setHighlight(true).setHighlightSnippets(1);
solrQuery.setParam("hl.fl", SearchFields.DESCRIPTION);
solrQuery.setParam("qt", "/spell");

QueryResponse queryResponse;
try {
Expand Down Expand Up @@ -74,7 +78,18 @@ public List<SolrSearchResult> search(String queryFromUser) {
solrSearchResult.setType(type);
solrSearchResults.add(solrSearchResult);
}
return solrSearchResults;
}
Map<String, List<String>> spellingSuggestionsByToken = new HashMap<>();
SpellCheckResponse spellCheckResponse = queryResponse.getSpellCheckResponse();
if (spellCheckResponse != null) {
List<SpellCheckResponse.Suggestion> suggestions = spellCheckResponse.getSuggestions();
for (SpellCheckResponse.Suggestion suggestion : suggestions) {
spellingSuggestionsByToken.put(suggestion.getToken(), suggestion.getAlternatives());
}
}

SolrQueryResponse solrQueryResponse = new SolrQueryResponse();
solrQueryResponse.setSolrSearchResults(solrSearchResults);
solrQueryResponse.setSpellingSuggestionsByToken(spellingSuggestionsByToken);
return solrQueryResponse;
}
}
27 changes: 27 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/SolrQueryResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package edu.harvard.iq.dataverse;

import java.util.List;
import java.util.Map;

public class SolrQueryResponse {

private List<SolrSearchResult> solrSearchResults;
private Map<String, List<String>> spellingSuggestionsByToken;

public List<SolrSearchResult> getSolrSearchResults() {
return solrSearchResults;
}

public void setSolrSearchResults(List<SolrSearchResult> solrSearchResults) {
this.solrSearchResults = solrSearchResults;
}

public Map<String, List<String>> getSpellingSuggestionsByToken() {
return spellingSuggestionsByToken;
}

public void setSpellingSuggestionsByToken(Map<String, List<String>> spellingSuggestionsByToken) {
this.spellingSuggestionsByToken = spellingSuggestionsByToken;
}

}
15 changes: 14 additions & 1 deletion src/main/java/edu/harvard/iq/dataverse/api/Search.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@

import edu.harvard.iq.dataverse.SolrSearchResult;
import edu.harvard.iq.dataverse.SearchServiceBean;
import edu.harvard.iq.dataverse.SolrQueryResponse;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
Expand All @@ -24,14 +27,24 @@ public class Search {
// public JsonObject search(@QueryParam("q") String query) {
public String search(@QueryParam("q") String query) {
if (query != null) {
List<SolrSearchResult> solrSearchResults = searchService.search(query);
SolrQueryResponse solrQueryResponse = searchService.search(query);

JsonArrayBuilder filesArrayBuilder = Json.createArrayBuilder();
List<SolrSearchResult> solrSearchResults = solrQueryResponse.getSolrSearchResults();
for (SolrSearchResult solrSearchResult : solrSearchResults) {
filesArrayBuilder.add(solrSearchResult.toJsonObject());

}

JsonObjectBuilder spelling_alternatives = Json.createObjectBuilder();
for (Map.Entry<String, List<String>> entry : solrQueryResponse.getSpellingSuggestionsByToken().entrySet()) {
spelling_alternatives.add(entry.getKey(), entry.getValue().toString());
}

JsonObject value = Json.createObjectBuilder()
.add("total_count", solrSearchResults.size())
.add("items", solrSearchResults.toString())
.add("spelling_alternatives", spelling_alternatives)
.add("itemsJson", filesArrayBuilder.build())
.build();
logger.info("value: " + value);
Expand Down
1 change: 1 addition & 0 deletions src/main/webapp/search.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@

<!-- Content Panel -->
<p:panel id="content">
<h:outputText style="color: red" value="Did you mean #{SearchPage.spelling_alternatives}?" rendered="#{SearchPage.spelling_alternatives.size() != 0}"/>
<p:tabView id="tabView" widgetVar="content">
<p:tab id="dataversesTab" title="Dataverses">
<p:dataTable id="dataversesTable" value="#{SearchPage.dataverses}" var="dataverse">
Expand Down

0 comments on commit 60e640b

Please sign in to comment.