source: gs3-extensions/solr/trunk/src/src/java/org/greenstone/gsdl3/service/SolrSearch.java@ 24647

Last change on this file since 24647 was 24641, checked in by davidb, 13 years ago

Initial cut at Greenstone3 runtime code to support Solr. Solr code based on version 3.3, so this also include an upgraded version of the LuceneWrapper code (gs2build/common-src/indexers/lucene-gs) that works with this version of the support jar files

  • Property svn:executable set to *
File size: 4.8 KB
Line 
1package org.greenstone.gsdl3.service;
2
3
4// Based on LuceneSearch, but not thoroughly tested
5
6// Greenstone classes
7import org.greenstone.gsdl3.util.*;
8import org.greenstone.util.GlobalProperties;
9
10// XML classes
11import org.w3c.dom.Element;
12import org.w3c.dom.Document;
13import org.w3c.dom.NodeList;
14
15import java.util.HashMap;
16import java.util.ArrayList;
17
18
19import org.apache.solr.client.solrj.SolrQuery;
20import org.apache.solr.client.solrj.SolrServer;
21import org.apache.solr.client.solrj.SolrServerException;
22import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
23import org.apache.solr.client.solrj.response.QueryResponse;
24import org.apache.solr.common.SolrDocument;
25import org.apache.solr.common.SolrDocumentList;
26import org.apache.solr.common.params.ModifiableSolrParams;
27import org.apache.solr.common.params.SolrParams;
28import org.apache.solr.common.util.NamedList;
29import org.apache.solr.servlet.SolrRequestParsers;
30import org.apache.solr.core.CoreContainer;
31
32import java.io.File;
33import java.util.Collection;
34
35
36import org.apache.log4j.*;
37
38
39public class SolrSearch extends LuceneSearch {
40
41 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.SolrSearch.class.getName());
42
43 static protected CoreContainer solr_cores = null;
44 protected HashMap solr_server;
45
46 public SolrSearch()
47 {
48 solr_server = new HashMap();
49
50 if (solr_cores == null) {
51 // Share one CoreContainer across all sties/collections
52 try {
53
54 String gsdl3_home = GlobalProperties.getGSDL3Home();
55 String solr_ext_name = GlobalProperties.getProperty("gsdlext.solr.dirname","solr");
56
57 String solr_home_str = GSFile.extHome(gsdl3_home,solr_ext_name);
58 File solr_home = new File(solr_home_str);
59 File solr_xml = new File( solr_home,"solr.xml" );
60
61 solr_cores = new CoreContainer(solr_home_str,solr_xml);
62 }
63 catch (Exception e) {
64 e.printStackTrace();
65 }
66 }
67 }
68
69
70 public boolean configure(Element info, Element extra_info) {
71 if (!super.configure(info, extra_info)){
72 return false;
73 }
74
75 // initialize required number of SolrCores based on values
76 // in 'index_ids' that are set by LuceneSearch::configure()
77
78 String site_name = this.router.getSiteName();
79 String coll_name = this.cluster_name;
80
81 for (int i=0; i<index_ids.size(); i++) {
82
83 String idx_name = (String)index_ids.get(i);
84 String core_name = site_name + "-" + coll_name + "-" + idx_name;
85
86 EmbeddedSolrServer solr_core
87 = new EmbeddedSolrServer(solr_cores,core_name);
88
89 solr_server.put(core_name,solr_core);
90 }
91
92 return true;
93 }
94
95 protected void getIndexData(ArrayList index_ids, ArrayList index_names, String lang)
96 {
97 }
98
99 /** Process a text query - implemented by concrete subclasses */
100 protected Element processTextQuery(Element request) {
101
102 Element result = this.doc.createElement(GSXML.RESPONSE_ELEM);
103 Element doc_node_list = this.doc.createElement(GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
104 Element metadata_list = this.doc.createElement(GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
105 initResultElement(result,doc_node_list,metadata_list);
106
107 if (!hasParamList(request,metadata_list)) {
108 return result;
109 }
110
111 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
112 if (!hasQueryString(param_list,metadata_list)) {
113 return result;
114 }
115
116 HashMap params = GSXML.extractParams(param_list, false);
117 String query_string = (String) params.get(QUERY_PARAM);
118
119
120 // Get the index
121 String index = (String) params.get(INDEX_PARAM);
122 if (index == null || index.equals("")) {
123 index = this.default_index; // assume the default
124 }
125
126 try {
127
128 ModifiableSolrParams solrParams = new ModifiableSolrParams();
129 solrParams.set("q", query_string);
130 //solrParams.set("start", start);
131 //solrParams.set("rows", nbDocuments);
132
133 String site_name = this.router.getSiteName();
134 String coll_name = this.cluster_name;
135
136 String core_name = site_name + "-" + coll_name + "-" + index;
137
138 EmbeddedSolrServer solr_core = (EmbeddedSolrServer)solr_server.get(core_name);
139
140 QueryResponse solrResponse = solr_core.query(solrParams);
141
142 SolrDocumentList hits = solrResponse.getResults();
143
144 if (hits != null) {
145 // or should this be docs.getNumFound() ??
146 GSXML.addMetadata(this.doc, metadata_list, "numDocsMatched", ""+hits.size());
147
148 System.err.println(hits.getNumFound() + " documents found, "
149 + hits.size() + " returned : ");
150
151 for (int i = 0; i < hits.size(); i++) {
152 SolrDocument solr_doc = hits.get(i);
153
154 String node_id = (String)solr_doc.get("docOID");
155 Element node = this.doc.createElement(GSXML.DOC_NODE_ELEM);
156 node.setAttribute(GSXML.NODE_ID_ATT, node_id);
157 doc_node_list.appendChild(node);
158
159 System.out.println("\t" + solr_doc.toString());
160 }
161 }
162 } catch (Exception e) {
163 e.printStackTrace();
164 }
165
166 return result;
167
168 }
169
170
171}
Note: See TracBrowser for help on using the repository browser.