1 |
1942
|
vassilis.s
|
package eu.dnetlib.data.search.app;
|
2 |
|
|
|
3 |
|
|
import eu.dnetlib.api.data.IndexService;
|
4 |
|
|
import eu.dnetlib.api.data.IndexServiceException;
|
5 |
|
|
import eu.dnetlib.api.data.SearchService;
|
6 |
|
|
import eu.dnetlib.api.data.SearchServiceException;
|
7 |
32902
|
katerina.i
|
import eu.dnetlib.api.enabling.ISLookUpService;
|
8 |
16443
|
katerina.i
|
import eu.dnetlib.common.rmi.UnimplementedException;
|
9 |
3131
|
vassilis.s
|
import eu.dnetlib.data.search.app.plan.FieldRewriteRule;
|
10 |
|
|
import eu.dnetlib.data.search.app.plan.QueryRewriteRule;
|
11 |
47316
|
katerina.i
|
import eu.dnetlib.data.search.solr.SolrResultSet;
|
12 |
15476
|
katerina.i
|
import eu.dnetlib.data.search.transform.Transformer;
|
13 |
|
|
import eu.dnetlib.data.search.transform.config.SearchRegistry;
|
14 |
17557
|
katerina.i
|
import eu.dnetlib.data.search.transform.formatter.Formatter;
|
15 |
27917
|
antonis.le
|
import eu.dnetlib.domain.ActionType;
|
16 |
1942
|
vassilis.s
|
import eu.dnetlib.domain.EPR;
|
17 |
27917
|
antonis.le
|
import eu.dnetlib.domain.ResourceType;
|
18 |
17557
|
katerina.i
|
import eu.dnetlib.domain.data.FormattedSearchResult;
|
19 |
16443
|
katerina.i
|
import eu.dnetlib.domain.data.SearchResult;
|
20 |
14602
|
katerina.i
|
import eu.dnetlib.domain.data.SuggestiveResult;
|
21 |
27917
|
antonis.le
|
import eu.dnetlib.domain.enabling.Notification;
|
22 |
1942
|
vassilis.s
|
import gr.uoa.di.driver.app.DriverServiceImpl;
|
23 |
27917
|
antonis.le
|
import gr.uoa.di.driver.enabling.issn.NotificationListener;
|
24 |
15476
|
katerina.i
|
import gr.uoa.di.driver.enabling.resultset.ResultSet;
|
25 |
2943
|
vassilis.s
|
import gr.uoa.di.driver.enabling.resultset.ResultSetFactory;
|
26 |
1942
|
vassilis.s
|
import gr.uoa.di.driver.util.ServiceLocator;
|
27 |
28341
|
katerina.i
|
import org.apache.log4j.Logger;
|
28 |
49850
|
katerina.i
|
import org.apache.solr.client.solrj.SolrServerException;
|
29 |
32902
|
katerina.i
|
import org.w3c.dom.Document;
|
30 |
|
|
import org.w3c.dom.Node;
|
31 |
|
|
import org.xml.sax.InputSource;
|
32 |
1942
|
vassilis.s
|
|
33 |
32902
|
katerina.i
|
import javax.xml.parsers.DocumentBuilder;
|
34 |
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
35 |
|
|
import javax.xml.xpath.XPath;
|
36 |
|
|
import javax.xml.xpath.XPathConstants;
|
37 |
|
|
import javax.xml.xpath.XPathExpression;
|
38 |
|
|
import javax.xml.xpath.XPathFactory;
|
39 |
49850
|
katerina.i
|
import java.io.OutputStream;
|
40 |
32902
|
katerina.i
|
import java.io.StringReader;
|
41 |
28341
|
katerina.i
|
import java.util.*;
|
42 |
1942
|
vassilis.s
|
|
43 |
30806
|
katerina.i
|
//import eu.dnetlib.utils.cql.CqlException;
|
44 |
|
|
|
45 |
1942
|
vassilis.s
|
public class SearchServiceImpl extends DriverServiceImpl
|
46 |
30806
|
katerina.i
|
implements SearchService {
|
47 |
|
|
|
48 |
|
|
private static Logger logger = Logger.getLogger(SearchServiceImpl.class);
|
49 |
47316
|
katerina.i
|
//@Deprecated
|
50 |
|
|
//private static Logger tlogger = Logger.getLogger("eu.dnetlib.data.search.app.Timer");
|
51 |
30806
|
katerina.i
|
|
52 |
47316
|
katerina.i
|
private String mdFormat = "DMF";
|
53 |
27917
|
antonis.le
|
private String indexLayout = "index";
|
54 |
25725
|
antonis.le
|
|
55 |
30806
|
katerina.i
|
private ServiceLocator<IndexService> indexLocator = null;
|
56 |
32902
|
katerina.i
|
private ServiceLocator<ISLookUpService> lookUpServiceServiceLocator = null;
|
57 |
30806
|
katerina.i
|
private ResultSetFactory rsFactory = null;
|
58 |
15459
|
antonis.le
|
|
59 |
30806
|
katerina.i
|
private SearchRegistry transformerFactory = null;
|
60 |
47316
|
katerina.i
|
|
61 |
30806
|
katerina.i
|
private List<QueryRewriteRule> queryRules = null;
|
62 |
47316
|
katerina.i
|
private List<String> fieldQueryRules = null;
|
63 |
|
|
|
64 |
30806
|
katerina.i
|
private Map<String, FieldRewriteRule> fieldRules = null;
|
65 |
|
|
private boolean enableBrowseCache = false;
|
66 |
|
|
|
67 |
27917
|
antonis.le
|
private SearchServiceBlackboardHandler blackboardNotificationHandler = null;
|
68 |
15459
|
antonis.le
|
|
69 |
47316
|
katerina.i
|
//private CQLParser cqlParser = null;
|
70 |
27917
|
antonis.le
|
@Override
|
71 |
|
|
public void init() {
|
72 |
|
|
super.init();
|
73 |
2378
|
vassilis.s
|
|
74 |
32902
|
katerina.i
|
String serviceId = this.getServiceEPR().getParameter("serviceId");
|
75 |
|
|
|
76 |
27917
|
antonis.le
|
this.subscribe(
|
77 |
|
|
ActionType.UPDATE,
|
78 |
45684
|
katerina.i
|
ResourceType.ANY.SEARCHSERVICERESOURCETYPE,
|
79 |
32902
|
katerina.i
|
serviceId,
|
80 |
27917
|
antonis.le
|
"RESOURCE_PROFILE/BODY/BLACKBOARD/LAST_REQUEST",
|
81 |
|
|
new NotificationListener() {
|
82 |
2378
|
vassilis.s
|
|
83 |
30806
|
katerina.i
|
@Override
|
84 |
|
|
public void processNotification(Notification notification) {
|
85 |
|
|
blackboardNotificationHandler.notified(
|
86 |
|
|
notification.getSubscriptionId(),
|
87 |
|
|
notification.getTopic(),
|
88 |
|
|
notification.getIsId(),
|
89 |
|
|
notification.getMessage());
|
90 |
|
|
}
|
91 |
|
|
});
|
92 |
32902
|
katerina.i
|
|
93 |
|
|
try {
|
94 |
|
|
String searchProfile = lookUpServiceServiceLocator.getService().getResourceProfile(serviceId);
|
95 |
47316
|
katerina.i
|
|
96 |
32902
|
katerina.i
|
if (searchProfile != null) {
|
97 |
|
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
98 |
|
|
dbf.setNamespaceAware(true);
|
99 |
|
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
100 |
|
|
Document doc = db.parse(new InputSource(new StringReader(searchProfile)));
|
101 |
|
|
|
102 |
|
|
|
103 |
|
|
XPathFactory factory = XPathFactory.newInstance();
|
104 |
|
|
XPath xpath = factory.newXPath();
|
105 |
|
|
|
106 |
|
|
XPathExpression searchMdFormatExpression = xpath.compile("//SERVICE_PROPERTIES/PROPERTY[@key='mdformat']");
|
107 |
47316
|
katerina.i
|
Node node = (Node) searchMdFormatExpression.evaluate(doc,XPathConstants.NODE);
|
108 |
32902
|
katerina.i
|
|
109 |
|
|
if (node != null){
|
110 |
|
|
String profileMdFormat = node.getAttributes().getNamedItem("value").getTextContent();
|
111 |
|
|
if (profileMdFormat != null) {
|
112 |
47316
|
katerina.i
|
//logger.debug("mdformat in properties " + mdFormat );
|
113 |
33670
|
katerina.i
|
logger.info("Setting mdformat to '" + profileMdFormat + "'");
|
114 |
32902
|
katerina.i
|
mdFormat = profileMdFormat;
|
115 |
|
|
}
|
116 |
|
|
}
|
117 |
|
|
}
|
118 |
|
|
|
119 |
|
|
} catch (Exception e) {
|
120 |
|
|
logger.error("Fail to load search service profile with id " + serviceId + " from IS.", e);
|
121 |
|
|
}
|
122 |
55639
|
katerina.i
|
|
123 |
27917
|
antonis.le
|
}
|
124 |
6829
|
antonis.le
|
|
125 |
30806
|
katerina.i
|
@Override
|
126 |
47316
|
katerina.i
|
public SuggestiveResult suggestiveSearch(String query) throws SearchServiceException {
|
127 |
30806
|
katerina.i
|
throw new UnimplementedException();
|
128 |
|
|
}
|
129 |
15476
|
katerina.i
|
|
130 |
47316
|
katerina.i
|
@Override
|
131 |
|
|
@Deprecated
|
132 |
|
|
public SearchResult search(String text, String transformer, String locale, int page, int size) throws SearchServiceException {
|
133 |
|
|
return searchNrefine(text, transformer, null, locale, page, size, null);
|
134 |
|
|
}
|
135 |
15160
|
katerina.i
|
|
136 |
47316
|
katerina.i
|
@Override
|
137 |
|
|
@Deprecated
|
138 |
|
|
public SearchResult refine(String text, String transformer, String locale, Collection<String> fields) throws SearchServiceException {
|
139 |
|
|
return searchNrefine(text, null, transformer, locale, 1, -1, fields);
|
140 |
30806
|
katerina.i
|
}
|
141 |
16443
|
katerina.i
|
|
142 |
30806
|
katerina.i
|
@Override
|
143 |
47316
|
katerina.i
|
@Deprecated
|
144 |
|
|
public SearchResult searchNrefine(String text, String searchTransformer, String browseTransformer,
|
145 |
|
|
String locale, int page, int size, Collection<String> fields) throws SearchServiceException {
|
146 |
46969
|
katerina.i
|
|
147 |
50748
|
katerina.i
|
//logger.info("deprecated searchNrefine > from: " + page + " to:" + size);
|
148 |
47316
|
katerina.i
|
//TODO check locale
|
149 |
50748
|
katerina.i
|
//logger.debug("Search transformer " + searchTransformer);
|
150 |
47316
|
katerina.i
|
Transformer sTransformer = transformerFactory.getTransformer(searchTransformer, Locale.getDefault());
|
151 |
|
|
Transformer oldRefineTransformer = transformerFactory.getTransformer("results_openaire_browse", Locale.getDefault());
|
152 |
16443
|
katerina.i
|
|
153 |
50748
|
katerina.i
|
//logger.debug("Refine transformer " + browseTransformer);
|
154 |
47316
|
katerina.i
|
//Transformer rTranformer = transformerFactory.getTransformer(refineTransformer, Locale.getDefault());
|
155 |
30806
|
katerina.i
|
|
156 |
47316
|
katerina.i
|
List<String> refineFields = null;
|
157 |
|
|
if (fields!=null) {
|
158 |
|
|
refineFields = new ArrayList<String>(fields);
|
159 |
30806
|
katerina.i
|
}
|
160 |
|
|
|
161 |
47316
|
katerina.i
|
return newSearch(text, locale, refineFields, new ArrayList<String>(), page, size, "", sTransformer, oldRefineTransformer, true);
|
162 |
|
|
}
|
163 |
30806
|
katerina.i
|
|
164 |
47316
|
katerina.i
|
@Override
|
165 |
|
|
public FormattedSearchResult search(String queryText, String transformerName, String format, String locale, int page, int size)
|
166 |
|
|
throws SearchServiceException {
|
167 |
|
|
return searchNrefine(queryText, transformerName, null, format, locale, page, size, null);
|
168 |
|
|
}
|
169 |
30806
|
katerina.i
|
|
170 |
47316
|
katerina.i
|
@Override
|
171 |
|
|
public FormattedSearchResult refine(String queryText, String refineTransformer, String format, String locale, Collection<String> fields) throws SearchServiceException {
|
172 |
|
|
return searchNrefine(queryText, null, refineTransformer, format, locale, 0, -1, fields);
|
173 |
30806
|
katerina.i
|
}
|
174 |
16443
|
katerina.i
|
|
175 |
30806
|
katerina.i
|
@Override
|
176 |
47316
|
katerina.i
|
public FormattedSearchResult searchNrefine(String queryText,
|
177 |
|
|
String searchTransformer, String refineTransformer, String format,
|
178 |
|
|
String locale, int page, int size, Collection<String> fields) throws SearchServiceException {
|
179 |
45684
|
katerina.i
|
|
180 |
|
|
|
181 |
47316
|
katerina.i
|
//logger.info("searchNrefine > from: " + page + " to:" + size);
|
182 |
|
|
//TODO check locale
|
183 |
|
|
FormattedSearchResult formattedSearchResult = null;
|
184 |
17818
|
dimitra.ke
|
|
185 |
50748
|
katerina.i
|
//logger.debug("Search transformer " + searchTransformer);
|
186 |
47316
|
katerina.i
|
Transformer sTransformer = transformerFactory.getTransformer(searchTransformer, Locale.getDefault());
|
187 |
|
|
Transformer oldRefineTransformer = transformerFactory.getTransformer("results_openaire_browse", Locale.getDefault());
|
188 |
16443
|
katerina.i
|
|
189 |
50748
|
katerina.i
|
//logger.debug("Refine transformer " + refineTransformer);
|
190 |
47316
|
katerina.i
|
//Transformer rTranformer = transformerFactory.getTransformer(refineTransformer, Locale.getDefault());
|
191 |
16443
|
katerina.i
|
|
192 |
47316
|
katerina.i
|
List<String> refineFields = null;
|
193 |
|
|
if (fields!=null) {
|
194 |
|
|
refineFields = new ArrayList<String>(fields);
|
195 |
30806
|
katerina.i
|
}
|
196 |
47316
|
katerina.i
|
SearchResult searchResult = newSearch(queryText, locale, refineFields, new ArrayList<String>(), page, size, format, sTransformer, oldRefineTransformer, true);
|
197 |
16443
|
katerina.i
|
|
198 |
47316
|
katerina.i
|
Formatter formatter = transformerFactory.getFormatter(format); // formatter cannot be returned as null
|
199 |
|
|
try {
|
200 |
|
|
formattedSearchResult = new FormattedSearchResult(formatter.format(searchResult), searchResult.getTotal());
|
201 |
16443
|
katerina.i
|
|
202 |
47316
|
katerina.i
|
} catch (Exception e) {
|
203 |
|
|
logger.error("Error formating search results.", e);
|
204 |
30806
|
katerina.i
|
}
|
205 |
|
|
|
206 |
47316
|
katerina.i
|
return formattedSearchResult;
|
207 |
30806
|
katerina.i
|
}
|
208 |
|
|
|
209 |
47316
|
katerina.i
|
public SearchResult newSearch (String text, String locale, List<String> refinefields, List<String> fieldQueries,
|
210 |
|
|
int from, int to, String format, Transformer transformer, Transformer oldRefineTransformer,
|
211 |
|
|
boolean oldPaging) throws SearchServiceException {
|
212 |
50748
|
katerina.i
|
logger.info("newSearch > from: " + from + " to:" + to);
|
213 |
47316
|
katerina.i
|
long startTime = System.nanoTime();
|
214 |
30806
|
katerina.i
|
|
215 |
47316
|
katerina.i
|
IndexService index = getIndexLocator().getService();
|
216 |
45684
|
katerina.i
|
|
217 |
30806
|
katerina.i
|
EPR epr = null;
|
218 |
47316
|
katerina.i
|
ResultSet<String> rs = null;
|
219 |
30806
|
katerina.i
|
|
220 |
47316
|
katerina.i
|
List<String> browseResults = null;
|
221 |
30806
|
katerina.i
|
List<String> searchResults = null;
|
222 |
|
|
|
223 |
47316
|
katerina.i
|
String query = rewrite(text);
|
224 |
|
|
enhanceFieldQueries(fieldQueries);
|
225 |
|
|
logger.info("Performing query " + query + "' and fields " + fieldQueries + " and refine " + refinefields);
|
226 |
30806
|
katerina.i
|
|
227 |
|
|
try {
|
228 |
47316
|
katerina.i
|
//TODO see parser and maybe delete!
|
229 |
|
|
//query = new CQLParser().parse(query).toCQL();
|
230 |
|
|
String eprQuery = createEprQuery(query, refinefields, fieldQueries);
|
231 |
30806
|
katerina.i
|
|
232 |
47316
|
katerina.i
|
epr = index.getBrowsingStatistics(eprQuery, "all", mdFormat, indexLayout);
|
233 |
30806
|
katerina.i
|
|
234 |
47316
|
katerina.i
|
if (epr == null) {
|
235 |
|
|
throw new SearchServiceException("Something really strange happened there! Index returned null result set id.");
|
236 |
30806
|
katerina.i
|
}
|
237 |
|
|
|
238 |
47316
|
katerina.i
|
//get the locale TODO do we need this?
|
239 |
|
|
//String correctLocale = getCorrectLocale(locale);
|
240 |
|
|
//StringTokenizer tokenizer = new StringTokenizer(correctLocale, "_");
|
241 |
|
|
//Locale requestLocale = new Locale(tokenizer.nextToken(), tokenizer.nextToken());
|
242 |
30806
|
katerina.i
|
|
243 |
47316
|
katerina.i
|
rs = rsFactory.createResultSet(epr);
|
244 |
30806
|
katerina.i
|
|
245 |
47316
|
katerina.i
|
Map<String, List<String>> list = null;
|
246 |
|
|
if (oldPaging) {
|
247 |
|
|
list = ((SolrResultSet)rs).newGet(from-1, to, format, transformer, oldRefineTransformer);
|
248 |
30806
|
katerina.i
|
|
249 |
47316
|
katerina.i
|
} else {
|
250 |
|
|
list = ((SolrResultSet)rs).newGet(from, to, format, transformer, oldRefineTransformer);
|
251 |
30806
|
katerina.i
|
}
|
252 |
|
|
|
253 |
|
|
|
254 |
47316
|
katerina.i
|
searchResults = list.get("search");
|
255 |
|
|
browseResults = list.get("refine");
|
256 |
30806
|
katerina.i
|
|
257 |
|
|
} catch (IndexServiceException ise) {
|
258 |
|
|
logger.error("Error getting refine results.", ise);
|
259 |
|
|
throw new SearchServiceException("Error getting refine results.", ise);
|
260 |
|
|
|
261 |
|
|
}
|
262 |
|
|
|
263 |
47316
|
katerina.i
|
long estimatedTime = System.nanoTime() - startTime;
|
264 |
50018
|
katerina.i
|
logger.debug("Search time " + estimatedTime/1000000 + " milliseconds for query " + query +
|
265 |
47316
|
katerina.i
|
" and fields " + fieldQueries + " and refine " + refinefields + " from: "+ from + " and size " + to);
|
266 |
33670
|
katerina.i
|
|
267 |
47316
|
katerina.i
|
//logger.info("Returned results for NEW search query '" + query + "' and fields " + fieldQueries + " and refine " + refinefields);;
|
268 |
|
|
rs.close();
|
269 |
|
|
return new SearchResult(query, Locale.getDefault().toString(), rs.size(), from, to, searchResults, browseResults, refinefields);
|
270 |
|
|
}
|
271 |
49850
|
katerina.i
|
public void cursorSearch(String text, List<String> refinefields, List<String> fieldQueries,
|
272 |
|
|
String format, Transformer transformer, OutputStream os) throws SearchServiceException {
|
273 |
|
|
|
274 |
|
|
long startTime = System.nanoTime();
|
275 |
|
|
|
276 |
|
|
IndexService index = getIndexLocator().getService();
|
277 |
|
|
|
278 |
|
|
EPR epr = null;
|
279 |
|
|
ResultSet<String> rs = null;
|
280 |
|
|
|
281 |
|
|
String query = rewrite(text);
|
282 |
|
|
enhanceFieldQueries(fieldQueries);
|
283 |
55639
|
katerina.i
|
logger.info("Performing cursor query " + query + "' and fields " + fieldQueries + " and refine " + refinefields);
|
284 |
49870
|
katerina.i
|
logger.debug("Performing cursor query " + query + "' and fields " + fieldQueries + " and refine " + refinefields);
|
285 |
49850
|
katerina.i
|
|
286 |
49870
|
katerina.i
|
|
287 |
49850
|
katerina.i
|
try {
|
288 |
|
|
String eprQuery = createEprQuery(query, refinefields, fieldQueries);
|
289 |
|
|
epr = index.getBrowsingStatistics(eprQuery, "all", mdFormat, indexLayout);
|
290 |
|
|
|
291 |
|
|
if (epr == null) {
|
292 |
|
|
throw new SearchServiceException("Something really strange happened there! Index returned null result set id.");
|
293 |
|
|
}
|
294 |
|
|
|
295 |
|
|
rs = rsFactory.createResultSet(epr);
|
296 |
|
|
|
297 |
|
|
((SolrResultSet)rs).cursorGet(transformer,os);
|
298 |
|
|
|
299 |
|
|
} catch (IndexServiceException ise) {
|
300 |
|
|
logger.error("Error getting cursor results.", ise);
|
301 |
50018
|
katerina.i
|
throw new SearchServiceException("Error getting cursor results.", ise);
|
302 |
49850
|
katerina.i
|
|
303 |
50748
|
katerina.i
|
} catch (SolrServerException sse) {
|
304 |
49850
|
katerina.i
|
logger.error("Error getting cursor results.", sse);
|
305 |
50018
|
katerina.i
|
throw new SearchServiceException("Error getting cursor results.", sse);
|
306 |
49850
|
katerina.i
|
}
|
307 |
|
|
|
308 |
|
|
long estimatedTime = System.nanoTime() - startTime;
|
309 |
50018
|
katerina.i
|
logger.debug("Cursor search time " + estimatedTime/1000000 + " milliseconds for query " + query +
|
310 |
49850
|
katerina.i
|
" and fields " + fieldQueries + " and refine " + refinefields);
|
311 |
|
|
|
312 |
|
|
rs.close();
|
313 |
|
|
}
|
314 |
|
|
|
315 |
|
|
|
316 |
47316
|
katerina.i
|
private String rewrite(String query) {
|
317 |
|
|
if (queryRules != null) {
|
318 |
|
|
for (QueryRewriteRule queryRule: queryRules) {
|
319 |
|
|
if (logger.isDebugEnabled()) {
|
320 |
|
|
logger.debug("Apply rule " + query);
|
321 |
|
|
}
|
322 |
|
|
query = queryRule.apply(query);
|
323 |
|
|
if (logger.isDebugEnabled()) {
|
324 |
|
|
logger.debug("Rewritten query is " + query);
|
325 |
|
|
}
|
326 |
30806
|
katerina.i
|
}
|
327 |
|
|
}
|
328 |
47316
|
katerina.i
|
return query;
|
329 |
30806
|
katerina.i
|
}
|
330 |
|
|
|
331 |
47316
|
katerina.i
|
private void enhanceFieldQueries(List<String> fieldQueries) {
|
332 |
|
|
if (fieldQueries != null && fieldQueryRules != null && !fieldQueryRules.isEmpty()) {
|
333 |
|
|
fieldQueries.addAll(fieldQueryRules);
|
334 |
|
|
}
|
335 |
30806
|
katerina.i
|
}
|
336 |
|
|
|
337 |
47316
|
katerina.i
|
public void setFieldRules(Collection<FieldRewriteRule> fieldRules) {
|
338 |
|
|
this.fieldRules = new HashMap<String, FieldRewriteRule>();
|
339 |
|
|
for (FieldRewriteRule rule : fieldRules) {
|
340 |
|
|
String key = rule.getFieldName();
|
341 |
|
|
if (this.fieldRules.containsKey(key)) {
|
342 |
|
|
logger.warn("Multiple rules for field " + key);
|
343 |
|
|
logger.warn("Keeping last rule " + rule.getName());
|
344 |
|
|
}
|
345 |
|
|
this.fieldRules.put(key, rule);
|
346 |
30806
|
katerina.i
|
}
|
347 |
|
|
}
|
348 |
|
|
|
349 |
47316
|
katerina.i
|
public static String createEprQuery(String query, List<String> refineFields, List<String> fieldQueries) {
|
350 |
|
|
StringBuffer queryBuffer = new StringBuffer();
|
351 |
|
|
queryBuffer.append("query=");
|
352 |
30806
|
katerina.i
|
|
353 |
47316
|
katerina.i
|
StringBuffer facetsBuffer = new StringBuffer();
|
354 |
|
|
facetsBuffer.append("&groupby=");
|
355 |
30806
|
katerina.i
|
|
356 |
47316
|
katerina.i
|
StringBuffer fqBuffer = new StringBuffer();
|
357 |
|
|
fqBuffer.append("&fq=");
|
358 |
30806
|
katerina.i
|
|
359 |
47316
|
katerina.i
|
if (query != null) { //TODO consider exception?
|
360 |
|
|
queryBuffer.append(query);
|
361 |
30806
|
katerina.i
|
}
|
362 |
|
|
|
363 |
47316
|
katerina.i
|
if(refineFields != null) {
|
364 |
|
|
for (Iterator<String> iterator = refineFields.iterator(); iterator.hasNext(); ) {
|
365 |
|
|
facetsBuffer.append(iterator.next());
|
366 |
|
|
if (iterator.hasNext()) {
|
367 |
|
|
facetsBuffer.append(",");
|
368 |
|
|
}
|
369 |
|
|
}
|
370 |
30806
|
katerina.i
|
}
|
371 |
|
|
|
372 |
47316
|
katerina.i
|
if(fieldQueries != null) {
|
373 |
|
|
for (Iterator<String> iterator = fieldQueries.iterator(); iterator.hasNext(); ) {
|
374 |
|
|
fqBuffer.append(iterator.next());
|
375 |
|
|
if (iterator.hasNext()) {
|
376 |
|
|
fqBuffer.append(",");
|
377 |
30806
|
katerina.i
|
}
|
378 |
|
|
}
|
379 |
|
|
}
|
380 |
47316
|
katerina.i
|
|
381 |
|
|
return queryBuffer.append(facetsBuffer.toString()).append(fqBuffer.toString()).toString();
|
382 |
30806
|
katerina.i
|
}
|
383 |
|
|
|
384 |
55639
|
katerina.i
|
|
385 |
|
|
//TODO: I wish to remove this. This was only made (quick and dirty - only the enhanceFieldQueries(fieldQueries) is missing
|
386 |
|
|
//from newSearch() after a last time request for the portal to show all the publications and the deletedbyinference ones.
|
387 |
|
|
//I did not want to pass a parameter since I do not know if we are going to keep it. This is for a tech meeting showcase.
|
388 |
|
|
//If we want to keep this I need to redesign.
|
389 |
|
|
|
390 |
|
|
public SearchResult newSearchWithoutFieldQueries (String text, String locale, List<String> refinefields, List<String> fieldQueries,
|
391 |
|
|
int from, int to, String format, Transformer transformer, Transformer oldRefineTransformer,
|
392 |
|
|
boolean oldPaging) throws SearchServiceException {
|
393 |
|
|
logger.info("non filtered search for... > from: " + from + " to:" + to);
|
394 |
|
|
long startTime = System.nanoTime();
|
395 |
|
|
|
396 |
|
|
IndexService index = getIndexLocator().getService();
|
397 |
|
|
|
398 |
|
|
EPR epr = null;
|
399 |
|
|
ResultSet<String> rs = null;
|
400 |
|
|
|
401 |
|
|
List<String> browseResults = null;
|
402 |
|
|
List<String> searchResults = null;
|
403 |
|
|
|
404 |
|
|
String query = rewrite(text);
|
405 |
|
|
logger.info("Performing query " + query + "' and fields " + fieldQueries + " and refine " + refinefields);
|
406 |
|
|
|
407 |
|
|
try {
|
408 |
|
|
//TODO see parser and maybe delete!
|
409 |
|
|
//query = new CQLParser().parse(query).toCQL();
|
410 |
|
|
String eprQuery = createEprQuery(query, refinefields, fieldQueries);
|
411 |
|
|
|
412 |
|
|
epr = index.getBrowsingStatistics(eprQuery, "all", mdFormat, indexLayout);
|
413 |
|
|
|
414 |
|
|
if (epr == null) {
|
415 |
|
|
throw new SearchServiceException("Something really strange happened there! Index returned null result set id.");
|
416 |
|
|
}
|
417 |
|
|
|
418 |
|
|
//get the locale TODO do we need this?
|
419 |
|
|
//String correctLocale = getCorrectLocale(locale);
|
420 |
|
|
//StringTokenizer tokenizer = new StringTokenizer(correctLocale, "_");
|
421 |
|
|
//Locale requestLocale = new Locale(tokenizer.nextToken(), tokenizer.nextToken());
|
422 |
|
|
|
423 |
|
|
rs = rsFactory.createResultSet(epr);
|
424 |
|
|
|
425 |
|
|
Map<String, List<String>> list = null;
|
426 |
|
|
if (oldPaging) {
|
427 |
|
|
list = ((SolrResultSet)rs).newGet(from-1, to, format, transformer, oldRefineTransformer);
|
428 |
|
|
|
429 |
|
|
} else {
|
430 |
|
|
list = ((SolrResultSet)rs).newGet(from, to, format, transformer, oldRefineTransformer);
|
431 |
|
|
}
|
432 |
|
|
|
433 |
|
|
|
434 |
|
|
searchResults = list.get("search");
|
435 |
|
|
browseResults = list.get("refine");
|
436 |
|
|
|
437 |
|
|
} catch (IndexServiceException ise) {
|
438 |
|
|
logger.error("Error getting refine results.", ise);
|
439 |
|
|
throw new SearchServiceException("Error getting refine results.", ise);
|
440 |
|
|
|
441 |
|
|
}
|
442 |
|
|
|
443 |
|
|
long estimatedTime = System.nanoTime() - startTime;
|
444 |
|
|
logger.debug("Search time " + estimatedTime/1000000 + " milliseconds for query " + query +
|
445 |
|
|
" and fields " + fieldQueries + " and refine " + refinefields + " from: "+ from + " and size " + to);
|
446 |
|
|
|
447 |
|
|
//logger.info("Returned results for NEW search query '" + query + "' and fields " + fieldQueries + " and refine " + refinefields);;
|
448 |
|
|
rs.close();
|
449 |
|
|
return new SearchResult(query, Locale.getDefault().toString(), rs.size(), from, to, searchResults, browseResults, refinefields);
|
450 |
|
|
}
|
451 |
|
|
|
452 |
|
|
|
453 |
27917
|
antonis.le
|
public String getMdFormat() {
|
454 |
|
|
return mdFormat;
|
455 |
|
|
}
|
456 |
|
|
|
457 |
|
|
public void setMdFormat(String mdFormat) {
|
458 |
|
|
this.mdFormat = mdFormat;
|
459 |
|
|
}
|
460 |
|
|
|
461 |
|
|
public ServiceLocator<IndexService> getIndexLocator() {
|
462 |
|
|
return indexLocator;
|
463 |
|
|
}
|
464 |
|
|
|
465 |
|
|
public void setIndexLocator(ServiceLocator<IndexService> indexLocator) {
|
466 |
|
|
this.indexLocator = indexLocator;
|
467 |
|
|
}
|
468 |
|
|
|
469 |
|
|
public ResultSetFactory getRsFactory() {
|
470 |
|
|
return rsFactory;
|
471 |
|
|
}
|
472 |
|
|
|
473 |
|
|
public void setRsFactory(ResultSetFactory rsFactory) {
|
474 |
|
|
this.rsFactory = rsFactory;
|
475 |
|
|
}
|
476 |
|
|
|
477 |
|
|
public Collection<FieldRewriteRule> getFieldRules() {
|
478 |
|
|
return fieldRules.values();
|
479 |
|
|
}
|
480 |
|
|
|
481 |
|
|
public List<QueryRewriteRule> getQueryRules() {
|
482 |
|
|
return queryRules;
|
483 |
|
|
}
|
484 |
|
|
|
485 |
|
|
public void setQueryRules(List<QueryRewriteRule> queryRules) {
|
486 |
|
|
this.queryRules = queryRules;
|
487 |
|
|
}
|
488 |
|
|
|
489 |
|
|
public boolean isEnableBrowseCache() {
|
490 |
|
|
return enableBrowseCache;
|
491 |
|
|
}
|
492 |
|
|
|
493 |
|
|
public void setEnableBrowseCache(boolean enableBrowseCache) {
|
494 |
|
|
this.enableBrowseCache = enableBrowseCache;
|
495 |
|
|
}
|
496 |
|
|
|
497 |
|
|
public SearchRegistry getTransformerFactory() {
|
498 |
|
|
return transformerFactory;
|
499 |
|
|
}
|
500 |
|
|
|
501 |
47316
|
katerina.i
|
public void setTransformerFactory(SearchRegistry transformerFactory) { this.transformerFactory = transformerFactory; }
|
502 |
27917
|
antonis.le
|
|
503 |
|
|
public String getIndexLayout() {
|
504 |
|
|
return indexLayout;
|
505 |
|
|
}
|
506 |
|
|
|
507 |
|
|
public void setIndexLayout(String indexLayout) {
|
508 |
|
|
this.indexLayout = indexLayout;
|
509 |
|
|
}
|
510 |
|
|
|
511 |
|
|
public SearchServiceBlackboardHandler getBlackboardNotificationHandler() {
|
512 |
|
|
return blackboardNotificationHandler;
|
513 |
|
|
}
|
514 |
|
|
|
515 |
|
|
public void setBlackboardNotificationHandler(SearchServiceBlackboardHandler blackboardNotificationHandler) {
|
516 |
|
|
this.blackboardNotificationHandler = blackboardNotificationHandler;
|
517 |
|
|
}
|
518 |
32902
|
katerina.i
|
|
519 |
|
|
public void setLookUpServiceServiceLocator(ServiceLocator<ISLookUpService> lookUpServiceServiceLocator) {
|
520 |
|
|
this.lookUpServiceServiceLocator = lookUpServiceServiceLocator;
|
521 |
|
|
}
|
522 |
47316
|
katerina.i
|
|
523 |
|
|
public List<String> getFieldQueryRules() {
|
524 |
|
|
return fieldQueryRules;
|
525 |
|
|
}
|
526 |
|
|
|
527 |
|
|
public void setFieldQueryRules(List<String> fieldQueryRules) {
|
528 |
|
|
this.fieldQueryRules = fieldQueryRules;
|
529 |
|
|
}
|
530 |
30806
|
katerina.i
|
}
|