NIHVIVO-2437 Filtered search based on refinement links. Change default boolean operator from OR to AND. Unrelated code cleanup in ApplicationDaoJena.java.
This commit is contained in:
parent
f41d69753b
commit
b8471f62cf
3 changed files with 61 additions and 197 deletions
|
@ -508,7 +508,7 @@
|
||||||
<defaultSearchField>ALLTEXT</defaultSearchField>
|
<defaultSearchField>ALLTEXT</defaultSearchField>
|
||||||
|
|
||||||
<!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
|
<!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
|
||||||
<solrQueryParser defaultOperator="OR"/>
|
<solrQueryParser defaultOperator="AND"/>
|
||||||
|
|
||||||
<!-- copyField commands copy one field to another at the time a document
|
<!-- copyField commands copy one field to another at the time a document
|
||||||
is added to the index. It's used either to index the same field differently,
|
is added to the index. It's used either to index the same field differently,
|
||||||
|
|
|
@ -29,12 +29,12 @@ public class ApplicationDaoJena extends JenaBaseDao implements ApplicationDao {
|
||||||
|
|
||||||
Integer portalCount = null;
|
Integer portalCount = null;
|
||||||
List<String> externallyLinkedNamespaces = null;
|
List<String> externallyLinkedNamespaces = null;
|
||||||
ModelChangedListener modelChangedListener = null;
|
ModelChangedListener externalNamespaceChangeListener = null;
|
||||||
|
|
||||||
public ApplicationDaoJena(WebappDaoFactoryJena wadf) {
|
public ApplicationDaoJena(WebappDaoFactoryJena wadf) {
|
||||||
super(wadf);
|
super(wadf);
|
||||||
modelChangedListener = new ExternalNamespacesChangeListener();
|
externalNamespaceChangeListener = new ExternalNamespacesChangeListener();
|
||||||
getOntModelSelector().getDisplayModel().register(modelChangedListener);
|
getOntModelSelector().getDisplayModel().register(externalNamespaceChangeListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getApplicationResourceURI() {
|
private String getApplicationResourceURI() {
|
||||||
|
@ -117,18 +117,19 @@ public class ApplicationDaoJena extends JenaBaseDao implements ApplicationDao {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
if (modelChangedListener != null) {
|
if (externalNamespaceChangeListener != null) {
|
||||||
getOntModelSelector().getDisplayModel().unregister(modelChangedListener);
|
getOntModelSelector().getDisplayModel().unregister(externalNamespaceChangeListener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final boolean CLEAR_CACHE = true;
|
private static final boolean CLEAR_CACHE = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
public synchronized List<String> getExternallyLinkedNamespaces() {
|
public synchronized List<String> getExternallyLinkedNamespaces() {
|
||||||
return getExternallyLinkedNamespaces(!CLEAR_CACHE);
|
return getExternallyLinkedNamespaces(!CLEAR_CACHE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized List<String> getExternallyLinkedNamespaces(boolean clearCache) {
|
private synchronized List<String> getExternallyLinkedNamespaces(boolean clearCache) {
|
||||||
if (clearCache || externallyLinkedNamespaces == null) {
|
if (clearCache || externallyLinkedNamespaces == null) {
|
||||||
externallyLinkedNamespaces = new ArrayList<String>();
|
externallyLinkedNamespaces = new ArrayList<String>();
|
||||||
OntModel ontModel = getOntModelSelector().getDisplayModel();
|
OntModel ontModel = getOntModelSelector().getDisplayModel();
|
||||||
|
|
|
@ -15,7 +15,6 @@ import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
@ -27,9 +26,9 @@ import org.apache.lucene.analysis.Analyzer;
|
||||||
import org.apache.lucene.queryParser.MultiFieldQueryParser;
|
import org.apache.lucene.queryParser.MultiFieldQueryParser;
|
||||||
import org.apache.lucene.queryParser.QueryParser;
|
import org.apache.lucene.queryParser.QueryParser;
|
||||||
import org.apache.lucene.util.Version;
|
import org.apache.lucene.util.Version;
|
||||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
|
||||||
import org.apache.solr.client.solrj.SolrQuery;
|
import org.apache.solr.client.solrj.SolrQuery;
|
||||||
import org.apache.solr.client.solrj.SolrServer;
|
import org.apache.solr.client.solrj.SolrServer;
|
||||||
|
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||||
import org.apache.solr.common.SolrDocument;
|
import org.apache.solr.common.SolrDocument;
|
||||||
import org.apache.solr.common.SolrDocumentList;
|
import org.apache.solr.common.SolrDocumentList;
|
||||||
|
|
||||||
|
@ -53,7 +52,7 @@ import edu.cornell.mannlib.vitro.webapp.search.SearchException;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.beans.VitroHighlighter;
|
import edu.cornell.mannlib.vitro.webapp.search.beans.VitroHighlighter;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.beans.VitroQuery;
|
import edu.cornell.mannlib.vitro.webapp.search.beans.VitroQuery;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.beans.VitroQueryFactory;
|
import edu.cornell.mannlib.vitro.webapp.search.beans.VitroQueryFactory;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.lucene.Entity2LuceneDoc;
|
import edu.cornell.mannlib.vitro.webapp.search.lucene.Entity2LuceneDoc.VitroLuceneTermNames;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneSetup;
|
import edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneSetup;
|
||||||
import edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup;
|
import edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup;
|
||||||
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.LinkTemplateModel;
|
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.LinkTemplateModel;
|
||||||
|
@ -77,11 +76,9 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
private static final String XML_REQUEST_PARAM = "xml";
|
private static final String XML_REQUEST_PARAM = "xml";
|
||||||
private static final int DEFAULT_HITS_PER_PAGE = 25;
|
private static final int DEFAULT_HITS_PER_PAGE = 25;
|
||||||
private static final int DEFAULT_MAX_SEARCH_SIZE = 1000;
|
private static final int DEFAULT_MAX_SEARCH_SIZE = 1000;
|
||||||
private static final float QUERY_BOOST = 2.0F;
|
|
||||||
|
|
||||||
protected static final Map<Format,Map<Result,String>> templateTable;
|
protected static final Map<Format,Map<Result,String>> templateTable;
|
||||||
|
|
||||||
//private IndexSearcher searcher = null;
|
|
||||||
protected enum Format {
|
protected enum Format {
|
||||||
HTML, XML;
|
HTML, XML;
|
||||||
}
|
}
|
||||||
|
@ -173,20 +170,10 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
|
|
||||||
String qtxt = vreq.getParameter(VitroQuery.QUERY_PARAMETER_NAME);
|
String qtxt = vreq.getParameter(VitroQuery.QUERY_PARAMETER_NAME);
|
||||||
|
|
||||||
// RY *** Analyzer
|
log.debug("Query text is "+ qtxt); // + " Analyzer is "+ analyzer.toString());
|
||||||
//Analyzer analyzer = getAnalyzer(getServletContext());
|
|
||||||
|
|
||||||
log.debug("Query text: " + qtxt);
|
|
||||||
|
|
||||||
SolrQuery query = getQuery(qtxt, maxHitCount, vreq);
|
SolrQuery query = getQuery(qtxt, maxHitCount, vreq);
|
||||||
|
|
||||||
// We need Solr to send us the entire result set back, otherwise we may not get all the
|
|
||||||
// right refinement links. For example, if all individuals on pg 1 are Persons, and on
|
|
||||||
// pg 2 there are FacultyMembers, we need to show the FacultyMember refinement link on
|
|
||||||
// both pages.
|
|
||||||
//parameters.set("start", startIndex);
|
|
||||||
//parameters.set("rows", hitsPerPage);
|
|
||||||
|
|
||||||
// ** For xml requested, add version=2.2 for xml version
|
// ** For xml requested, add version=2.2 for xml version
|
||||||
// is that enough, or do we also have to add wt param?
|
// is that enough, or do we also have to add wt param?
|
||||||
|
|
||||||
|
@ -196,55 +183,6 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
try {
|
try {
|
||||||
response = solr.query(query);
|
response = solr.query(query);
|
||||||
|
|
||||||
|
|
||||||
//log.debug("Query text is "+ qtxt + " Analyzer is "+ analyzer.toString());
|
|
||||||
|
|
||||||
// Query query = null;
|
|
||||||
// try {
|
|
||||||
// query = getQuery(vreq, portalFlag, analyzer, qtxt);
|
|
||||||
// log.debug("query for '" + qtxt +"' is " + query.toString());
|
|
||||||
// } catch (ParseException e) {
|
|
||||||
// return doBadQuery(portal, qtxt,format);
|
|
||||||
// }
|
|
||||||
|
|
||||||
//IndexSearcher searcherForRequest = LuceneIndexFactory.getIndexSearcher(getServletContext());
|
|
||||||
|
|
||||||
/* using the CustomSimilarity to override effects such as
|
|
||||||
* 1) rarity of a term doesn't affect the document score.
|
|
||||||
* 2) number of instances of a query term in the matched document doesn't affect the document score
|
|
||||||
* 3) field length doesn't affect the document score
|
|
||||||
*
|
|
||||||
* 3/29/2011 bk392
|
|
||||||
*/
|
|
||||||
// CustomSimilarity customSimilarity = new CustomSimilarity();
|
|
||||||
// searcherForRequest.setSimilarity(customSimilarity);
|
|
||||||
//
|
|
||||||
// TopDocs topDocs = null;
|
|
||||||
// try{
|
|
||||||
// log.debug("Searching for query term in the Index with maxHitSize "+ maxHitSize);
|
|
||||||
// log.debug("Query is "+ query.toString());
|
|
||||||
//
|
|
||||||
// //sets the query boost for the query. the lucene docs matching this query term
|
|
||||||
// //are multiplied by QUERY_BOOST to get their total score
|
|
||||||
// //query.setBoost(QUERY_BOOST);
|
|
||||||
//
|
|
||||||
// topDocs = searcherForRequest.search(query,null,maxHitSize);
|
|
||||||
//
|
|
||||||
// log.debug("Total hits for the query are "+ topDocs.totalHits);
|
|
||||||
// for(ScoreDoc scoreDoc : topDocs.scoreDocs){
|
|
||||||
//
|
|
||||||
// Document document = searcherForRequest.doc(scoreDoc.doc);
|
|
||||||
// Explanation explanation = searcherForRequest.explain(query, scoreDoc.doc);
|
|
||||||
//
|
|
||||||
// log.debug("Document title: "+ document.get(Entity2LuceneDoc.VitroLuceneTermNames.NAME) + " score: " +scoreDoc.score);
|
|
||||||
// log.debug("Scoring of the doc explained " + explanation.toString());
|
|
||||||
// log.debug("Explanation's description "+ explanation.getDescription());
|
|
||||||
// log.debug("ALLTEXT: " + document.get(Entity2LuceneDoc.VitroLuceneTermNames.ALLTEXT));
|
|
||||||
// log.debug("ALLTEXTUNSTEMMED: " + document.get(Entity2LuceneDoc.VitroLuceneTermNames.ALLTEXTUNSTEMMED));
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
log.error("in first pass at search: " + t);
|
log.error("in first pass at search: " + t);
|
||||||
// this is a hack to deal with odd cases where search and index threads interact
|
// this is a hack to deal with odd cases where search and index threads interact
|
||||||
|
@ -292,7 +230,7 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
for(int i = startIndex; i < lastHitToShow; i++){
|
for(int i = startIndex; i < lastHitToShow; i++){
|
||||||
try {
|
try {
|
||||||
SolrDocument doc = docs.get(i);
|
SolrDocument doc = docs.get(i);
|
||||||
String uri = doc.get(Entity2LuceneDoc.term.URI).toString();
|
String uri = doc.get(VitroLuceneTermNames.URI).toString();
|
||||||
log.debug("Retrieving individual with uri "+ uri);
|
log.debug("Retrieving individual with uri "+ uri);
|
||||||
Individual ent = new IndividualImpl();
|
Individual ent = new IndividualImpl();
|
||||||
ent.setURI(uri);
|
ent.setURI(uri);
|
||||||
|
@ -327,10 +265,10 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
}
|
}
|
||||||
|
|
||||||
String typeParam = vreq.getParameter("type");
|
String typeParam = vreq.getParameter("type");
|
||||||
boolean typeFiltereRequested = false;
|
boolean typeFilterRequested = false;
|
||||||
if (!StringUtils.isEmpty(typeParam)) {
|
if (!StringUtils.isEmpty(typeParam)) {
|
||||||
VClass type = vclassDao.getVClassByURI(typeParam);
|
VClass type = vclassDao.getVClassByURI(typeParam);
|
||||||
typeFiltereRequested = true;
|
typeFilterRequested = true;
|
||||||
if (type != null && type.getName() != null)
|
if (type != null && type.getName() != null)
|
||||||
body.put("typeName", type.getName());
|
body.put("typeName", type.getName());
|
||||||
}
|
}
|
||||||
|
@ -338,7 +276,7 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
/* Add classgroup and type refinement links to body */
|
/* Add classgroup and type refinement links to body */
|
||||||
if( wasHtmlRequested ){
|
if( wasHtmlRequested ){
|
||||||
// Search request includes no classgroup and no type, so add classgroup search refinement links.
|
// Search request includes no classgroup and no type, so add classgroup search refinement links.
|
||||||
if ( !classGroupFilterRequested && !typeFiltereRequested ) {
|
if ( !classGroupFilterRequested && !typeFilterRequested ) {
|
||||||
List<VClassGroup> classgroups = getClassGroups(grpDao, docs);
|
List<VClassGroup> classgroups = getClassGroups(grpDao, docs);
|
||||||
List<VClassGroupSearchLink> classGroupLinks = new ArrayList<VClassGroupSearchLink>(classgroups.size());
|
List<VClassGroupSearchLink> classGroupLinks = new ArrayList<VClassGroupSearchLink>(classgroups.size());
|
||||||
for (VClassGroup vcg : classgroups) {
|
for (VClassGroup vcg : classgroups) {
|
||||||
|
@ -350,7 +288,7 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
|
|
||||||
// Search request is for a classgroup, so add rdf:type search refinement links
|
// Search request is for a classgroup, so add rdf:type search refinement links
|
||||||
// but try to filter out classes that are subclasses
|
// but try to filter out classes that are subclasses
|
||||||
} else if ( classGroupFilterRequested && !typeFiltereRequested ) {
|
} else if ( classGroupFilterRequested && !typeFilterRequested ) {
|
||||||
List<VClass> vClasses = getVClasses(vclassDao, docs);
|
List<VClass> vClasses = getVClasses(vclassDao, docs);
|
||||||
List<VClassSearchLink> vClassLinks = new ArrayList<VClassSearchLink>(vClasses.size());
|
List<VClassSearchLink> vClassLinks = new ArrayList<VClassSearchLink>(vClasses.size());
|
||||||
for (VClass vc : vClasses) {
|
for (VClass vc : vClasses) {
|
||||||
|
@ -413,7 +351,7 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
for(int i=0; i<hitCount && n > grpsFound ;i++){
|
for(int i=0; i<hitCount && n > grpsFound ;i++){
|
||||||
try{
|
try{
|
||||||
SolrDocument doc = docs.get(i);
|
SolrDocument doc = docs.get(i);
|
||||||
Collection<Object> grps = doc.getFieldValues(Entity2LuceneDoc.term.CLASSGROUP_URI);
|
Collection<Object> grps = doc.getFieldValues(VitroLuceneTermNames.CLASSGROUP_URI);
|
||||||
if (grps != null) {
|
if (grps != null) {
|
||||||
for (Object o : grps) {
|
for (Object o : grps) {
|
||||||
String groupUri = o.toString();
|
String groupUri = o.toString();
|
||||||
|
@ -448,7 +386,6 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
return classgroups;
|
return classgroups;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<VClass> getVClasses(VClassDao vclassDao, SolrDocumentList docs){
|
private List<VClass> getVClasses(VClassDao vclassDao, SolrDocumentList docs){
|
||||||
HashSet<String> typesInHits = getVClassUrisForHits(docs);
|
HashSet<String> typesInHits = getVClassUrisForHits(docs);
|
||||||
List<VClass> classes = new ArrayList<VClass>(typesInHits.size());
|
List<VClass> classes = new ArrayList<VClass>(typesInHits.size());
|
||||||
|
@ -480,7 +417,7 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
HashSet<String> typesInHits = new HashSet<String>();
|
HashSet<String> typesInHits = new HashSet<String>();
|
||||||
for (SolrDocument doc : docs) {
|
for (SolrDocument doc : docs) {
|
||||||
try {
|
try {
|
||||||
Collection<Object> types = doc.getFieldValues(Entity2LuceneDoc.term.RDFTYPE);
|
Collection<Object> types = doc.getFieldValues(VitroLuceneTermNames.RDFTYPE);
|
||||||
if (types != null) {
|
if (types != null) {
|
||||||
for (Object o : types) {
|
for (Object o : types) {
|
||||||
String typeUri = o.toString();
|
String typeUri = o.toString();
|
||||||
|
@ -494,114 +431,51 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
return typesInHits;
|
return typesInHits;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Analyzer getAnalyzer(ServletContext servletContext) throws SearchException {
|
|
||||||
Object obj = servletContext.getAttribute(LuceneSetup.ANALYZER);
|
|
||||||
if( obj == null || !(obj instanceof Analyzer) )
|
|
||||||
throw new SearchException("Could not get analyzer");
|
|
||||||
else
|
|
||||||
return (Analyzer)obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private Query getQuery(VitroRequest request,
|
|
||||||
// Analyzer analyzer, String querystr ) throws SearchException, ParseException {
|
|
||||||
// Query query = null;
|
|
||||||
// try{
|
|
||||||
// //String querystr = request.getParameter(VitroQuery.QUERY_PARAMETER_NAME);
|
|
||||||
// if( querystr == null){
|
|
||||||
// log.error("There was no Parameter '"+VitroQuery.QUERY_PARAMETER_NAME
|
|
||||||
// +"' in the request.");
|
|
||||||
// return null;
|
|
||||||
// }else if( querystr.length() > MAX_QUERY_LENGTH ){
|
|
||||||
// log.debug("The search was too long. The maximum " +
|
|
||||||
// "query length is " + MAX_QUERY_LENGTH );
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// log.debug("Parsing query using QueryParser ");
|
|
||||||
//
|
|
||||||
// QueryParser parser = getQueryParser(analyzer);
|
|
||||||
// query = parser.parse(querystr);
|
|
||||||
//
|
|
||||||
// //check if this is classgroup filtered
|
|
||||||
// Object param = request.getParameter("classgroup");
|
|
||||||
// if( param != null && !"".equals(param)){
|
|
||||||
//
|
|
||||||
// log.debug("Firing classgroup query ");
|
|
||||||
// log.debug("request.getParameter(classgroup) is "+ param.toString());
|
|
||||||
//
|
|
||||||
// BooleanQuery boolQuery = new BooleanQuery();
|
|
||||||
// boolQuery.add( query, BooleanClause.Occur.MUST);
|
|
||||||
// boolQuery.add( new TermQuery(
|
|
||||||
// new Term(Entity2LuceneDoc.term.CLASSGROUP_URI,
|
|
||||||
// (String)param)),
|
|
||||||
// BooleanClause.Occur.MUST);
|
|
||||||
// query = boolQuery;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //check if this is rdf:type filtered
|
|
||||||
// param = request.getParameter("type");
|
|
||||||
// if( param != null && !"".equals(param)){
|
|
||||||
// log.debug("Firing type query ");
|
|
||||||
// log.debug("request.getParameter(type) is "+ param.toString());
|
|
||||||
//
|
|
||||||
// BooleanQuery boolQuery = new BooleanQuery();
|
|
||||||
// boolQuery.add( query, BooleanClause.Occur.MUST);
|
|
||||||
// boolQuery.add( new TermQuery(
|
|
||||||
// new Term(Entity2LuceneDoc.term.RDFTYPE,
|
|
||||||
// (String)param)),
|
|
||||||
// BooleanClause.Occur.MUST);
|
|
||||||
// query = boolQuery;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// log.debug("Query: " + query);
|
|
||||||
//
|
|
||||||
// } catch (ParseException e) {
|
|
||||||
// throw new ParseException(e.getMessage());
|
|
||||||
// } catch (Exception ex){
|
|
||||||
// throw new SearchException(ex.getMessage());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return query;
|
|
||||||
// }
|
|
||||||
|
|
||||||
private SolrQuery getQuery(String queryText, int maxHitCount, VitroRequest vreq) {
|
private SolrQuery getQuery(String queryText, int maxHitCount, VitroRequest vreq) {
|
||||||
SolrQuery query = new SolrQuery(queryText);
|
SolrQuery query = new SolrQuery(queryText);
|
||||||
|
//SolrQuery query = new SolrQuery();
|
||||||
|
//query.setQuery(queryText);
|
||||||
|
|
||||||
// Solr requires these values, but we don't want them to be the real values for this page
|
// Solr requires these values, but we don't want them to be the real values for this page
|
||||||
// of results, else the refinement links won't work correctly: if only Persons are on pg 1,
|
// of results, else the refinement links won't work correctly: each page of results needs to
|
||||||
// but there are FacultyMembers on pg 2, we still need to show the FacultyMember refinement
|
// show refinement links generated for all results, not just for the results on the current page.
|
||||||
// link on pg 1, which won't happen if we have retrieved only one page of results from Solr.
|
|
||||||
query.setStart(0);
|
query.setStart(0);
|
||||||
query.setRows(maxHitCount);
|
query.setRows(maxHitCount);
|
||||||
|
|
||||||
// RY Add other stuff here
|
// Classgroup filtering
|
||||||
// classgroups, type params
|
Object param = vreq.getParameter("classgroup");
|
||||||
|
if( param != null && !"".equals(param)){
|
||||||
|
log.debug("Firing classgroup query ");
|
||||||
|
log.debug("request.getParameter(classgroup) is "+ param.toString());
|
||||||
|
query = query.addFilterQuery(VitroLuceneTermNames.CLASSGROUP_URI + ":\"" + param + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
// rdf:type filtering
|
||||||
|
param = vreq.getParameter("type");
|
||||||
|
if( param != null && !"".equals(param)){
|
||||||
|
log.debug("Firing type query ");
|
||||||
|
log.debug("request.getParameter(type) is "+ param.toString());
|
||||||
|
query = query.addFilterQuery(VitroLuceneTermNames.RDFTYPE + ":\"" + param + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
//query.setQuery(queryText);
|
||||||
|
log.debug("Query = " + query.toString());
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("static-access")
|
@SuppressWarnings("unused")
|
||||||
private QueryParser getQueryParser(Analyzer analyzer){
|
private QueryParser getQueryParser(Analyzer analyzer){
|
||||||
//defaultSearchField indicates which field search against when there is no term
|
|
||||||
//indicated in the query string.
|
|
||||||
//The analyzer is needed so that we use the same analyzer on the search queries as
|
|
||||||
//was used on the text that was indexed.
|
|
||||||
//QueryParser qp = new QueryParser("NAME",analyzer);
|
|
||||||
//this sets the query parser to AND all of the query terms it finds.
|
|
||||||
//set up the map of stemmed field names -> unstemmed field names
|
|
||||||
// HashMap<String,String> map = new HashMap<String, String>();
|
|
||||||
// map.put(Entity2LuceneDoc.term.ALLTEXT,Entity2LuceneDoc.term.ALLTEXTUNSTEMMED);
|
|
||||||
// qp.setStemmedToUnstemmed(map);
|
|
||||||
|
|
||||||
MultiFieldQueryParser qp = new MultiFieldQueryParser(Version.LUCENE_29, new String[]{
|
|
||||||
"name", "nameunstemmed", "type", "moniker", "ALLTEXT", "ALLTEXTUNSTEMMED", "nameraw" , "classLocalName", "classLocalNameLowerCase" }, analyzer);
|
|
||||||
|
|
||||||
// QueryParser qp = new QueryParser(Version.LUCENE_29, "name", analyzer);
|
|
||||||
|
|
||||||
//AND_OPERATOR returns documents even if the terms in the query lie in different fields.
|
|
||||||
//The only requirement is that they exist in a single document.
|
|
||||||
//qp.setDefaultOperator(QueryParser.AND_OPERATOR);
|
|
||||||
|
|
||||||
|
MultiFieldQueryParser qp = new MultiFieldQueryParser(Version.LUCENE_29, new String[] {
|
||||||
|
VitroLuceneTermNames.NAME,
|
||||||
|
VitroLuceneTermNames.NAMEUNSTEMMED,
|
||||||
|
VitroLuceneTermNames.RDFTYPE,
|
||||||
|
VitroLuceneTermNames.ALLTEXT,
|
||||||
|
VitroLuceneTermNames.ALLTEXTUNSTEMMED,
|
||||||
|
VitroLuceneTermNames.NAMERAW,
|
||||||
|
VitroLuceneTermNames.CLASSLOCALNAME,
|
||||||
|
VitroLuceneTermNames.CLASSLOCALNAMELOWERCASE }, analyzer);
|
||||||
|
//"name", "nameunstemmed", "type", "ALLTEXT", "ALLTEXTUNSTEMMED", "nameraw" , "classLocalName", "classLocalNameLowerCase" }, analyzer);
|
||||||
|
|
||||||
return qp;
|
return qp;
|
||||||
}
|
}
|
||||||
|
@ -648,13 +522,11 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
|
|
||||||
private String getPreviousPageLink(int startIndex, int hitsPerPage, String baseUrl, ParamMap params) {
|
private String getPreviousPageLink(int startIndex, int hitsPerPage, String baseUrl, ParamMap params) {
|
||||||
params.put("startIndex", String.valueOf(startIndex-hitsPerPage));
|
params.put("startIndex", String.valueOf(startIndex-hitsPerPage));
|
||||||
//return new PagingLink("Previous", baseUrl, params);
|
|
||||||
return UrlBuilder.getUrl(baseUrl, params);
|
return UrlBuilder.getUrl(baseUrl, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getNextPageLink(int startIndex, int hitsPerPage, String baseUrl, ParamMap params) {
|
private String getNextPageLink(int startIndex, int hitsPerPage, String baseUrl, ParamMap params) {
|
||||||
params.put("startIndex", String.valueOf(startIndex+hitsPerPage));
|
params.put("startIndex", String.valueOf(startIndex+hitsPerPage));
|
||||||
//return new PagingLink("Next", baseUrl, params);
|
|
||||||
return UrlBuilder.getUrl(baseUrl, params);
|
return UrlBuilder.getUrl(baseUrl, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -681,12 +553,12 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
return new ExceptionResponseValues(getTemplate(f,Result.ERROR), body, e);
|
return new ExceptionResponseValues(getTemplate(f,Result.ERROR), body, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TemplateResponseValues doBadQuery(ApplicationBean appBean, String query, Format f) {
|
// private TemplateResponseValues doBadQuery(ApplicationBean appBean, String query, Format f) {
|
||||||
Map<String, Object> body = new HashMap<String, Object>();
|
// Map<String, Object> body = new HashMap<String, Object>();
|
||||||
body.put("title", "Search " + appBean.getApplicationName());
|
// body.put("title", "Search " + appBean.getApplicationName());
|
||||||
body.put("query", query);
|
// body.put("query", query);
|
||||||
return new TemplateResponseValues(getTemplate(f,Result.BAD_QUERY), body);
|
// return new TemplateResponseValues(getTemplate(f,Result.BAD_QUERY), body);
|
||||||
}
|
// }
|
||||||
|
|
||||||
private TemplateResponseValues doFailedSearch(String message, String querytext, Format f) {
|
private TemplateResponseValues doFailedSearch(String message, String querytext, Format f) {
|
||||||
Map<String, Object> body = new HashMap<String, Object>();
|
Map<String, Object> body = new HashMap<String, Object>();
|
||||||
|
@ -747,32 +619,22 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings({ "unchecked", "unused" })
|
||||||
private HashSet<String> getDataPropertyBlacklist(){
|
private HashSet<String> getDataPropertyBlacklist(){
|
||||||
HashSet<String>dpBlacklist = (HashSet<String>)
|
HashSet<String>dpBlacklist = (HashSet<String>)
|
||||||
getServletContext().getAttribute(LuceneSetup.SEARCH_DATAPROPERTY_BLACKLIST);
|
getServletContext().getAttribute(LuceneSetup.SEARCH_DATAPROPERTY_BLACKLIST);
|
||||||
return dpBlacklist;
|
return dpBlacklist;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings({ "unchecked", "unused" })
|
||||||
private HashSet<String> getObjectPropertyBlacklist(){
|
private HashSet<String> getObjectPropertyBlacklist(){
|
||||||
HashSet<String>opBlacklist = (HashSet<String>)
|
HashSet<String>opBlacklist = (HashSet<String>)
|
||||||
getServletContext().getAttribute(LuceneSetup.SEARCH_OBJECTPROPERTY_BLACKLIST);
|
getServletContext().getAttribute(LuceneSetup.SEARCH_OBJECTPROPERTY_BLACKLIST);
|
||||||
return opBlacklist;
|
return opBlacklist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private final String defaultSearchField = "ALLTEXT";
|
|
||||||
public static final int MAX_QUERY_LENGTH = 500;
|
public static final int MAX_QUERY_LENGTH = 500;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Need to accept notification from indexer that the index has been changed.
|
|
||||||
*/
|
|
||||||
// public void close() {
|
|
||||||
// searcher = null;
|
|
||||||
// }
|
|
||||||
|
|
||||||
public VitroHighlighter getHighlighter(VitroQuery q) {
|
public VitroHighlighter getHighlighter(VitroQuery q) {
|
||||||
throw new Error("PagedSearchController.getHighlighter() is unimplemented");
|
throw new Error("PagedSearchController.getHighlighter() is unimplemented");
|
||||||
}
|
}
|
||||||
|
@ -781,6 +643,7 @@ public class SolrPagedSearchController extends FreemarkerHttpServlet {
|
||||||
throw new Error("PagedSearchController.getQueryFactory() is unimplemented");
|
throw new Error("PagedSearchController.getQueryFactory() is unimplemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
public List search(VitroQuery query) throws SearchException {
|
public List search(VitroQuery query) throws SearchException {
|
||||||
throw new Error("PagedSearchController.search() is unimplemented");
|
throw new Error("PagedSearchController.search() is unimplemented");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue