List of usage examples for org.apache.solr.client.solrj SolrQuery getQuery
public String getQuery()
From source file:org.mycore.solr.search.MCRConditionTransformer.java
License:Open Source License
public static SolrQuery getSolrQuery(@SuppressWarnings("rawtypes") MCRCondition condition, List<MCRSortBy> sortBy, int maxResults) { String queryString = getQueryString(condition); SolrQuery q = applySortOptions(new SolrQuery(queryString), sortBy); q.setIncludeScore(true);/* w ww . ja v a2 s .c o m*/ q.setRows(maxResults == 0 ? Integer.MAX_VALUE : maxResults); String sort = q.getSortField(); LOGGER.info("Legacy Query transformed to: " + q.getQuery() + (sort != null ? " " + sort : "")); return q; }
From source file:org.mycore.solr.search.MCRConditionTransformer.java
License:Open Source License
/** * Builds SOLR query./* w w w . j a v a 2 s . com*/ * * Automatically builds JOIN-Query if content search fields are used in query. * @param sortBy sort criteria * @param not true, if all conditions should be negated * @param and AND or OR connective between conditions * @param table conditions per "content" or "metadata" * @param maxHits maximum hits */ @SuppressWarnings("rawtypes") public static SolrQuery buildMergedSolrQuery(List<MCRSortBy> sortBy, boolean not, boolean and, HashMap<String, List<MCRCondition>> table, int maxHits) { List<MCRCondition> queryConditions = table.get("metadata"); MCRCondition combined = buildSubCondition(queryConditions, and, not); SolrQuery solrRequestQuery = getSolrQuery(combined, sortBy, maxHits); for (Map.Entry<String, List<MCRCondition>> mapEntry : table.entrySet()) { if (!mapEntry.getKey().equals("metadata")) { MCRCondition combinedFilterQuery = buildSubCondition(mapEntry.getValue(), and, not); SolrQuery filterQuery = getSolrQuery(combinedFilterQuery, sortBy, maxHits); solrRequestQuery.addFilterQuery(MCRSolrConstants.JOIN_PATTERN + filterQuery.getQuery()); } } return solrRequestQuery; }
From source file:org.opencastproject.archive.opencast.solr.SolrRequester.java
License:Educational Community License
/** * Creates a search result from a given solr response. * //from w w w.j a va 2s .c o m * @param query * The solr query. * @return The search result. * @throws SolrServerException * if the solr server is not working as expected */ private OpencastResultSet runQuery(SolrQuery query) throws SolrServerException { final QueryResponse res = solrServer.query(query); final List<OpencastResultItem> items = mlist(res.getResults()).map(solrToItem).value(); final String queryString = query.getQuery(); final long totalSize = res.getResults().getNumFound(); final long limit = res.getResults().size(); final long offset = res.getResults().getStart(); final long searchTime = res.getQTime(); return new OpencastResultSet() { @Override public List<OpencastResultItem> getItems() { return items; } @Override public String getQuery() { return queryString; } @Override public long getTotalSize() { return totalSize; } @Override public long getLimit() { return limit; } @Override public long getOffset() { return offset; } @Override public long getSearchTime() { return searchTime; } }; }
From source file:org.opencastproject.episode.impl.Convert.java
License:Educational Community License
/** * Creates a list of <code>MediaSegment</code>s from the given result document. * * @param doc/*from w w w. jav a 2 s . co m*/ * the result document * @param query * the original query */ private static List<JaxbMediaSegment> createSearchResultSegments(SolrDocument doc, SolrQuery query) { List<JaxbMediaSegment> segments = new ArrayList<JaxbMediaSegment>(); // The maximum number of hits in a segment int maxHits = 0; // Loop over every segment for (String fieldName : doc.getFieldNames()) { if (!fieldName.startsWith(Schema.SEGMENT_TEXT_PREFIX)) continue; // Ceate a new segment int segmentId = Integer.parseInt(fieldName.substring(Schema.SEGMENT_TEXT_PREFIX.length())); JaxbMediaSegment segment = new JaxbMediaSegment(segmentId); segment.setText(mkString(doc.getFieldValue(fieldName))); // Read the hints for this segment Properties segmentHints = new Properties(); try { String hintFieldName = Schema.SEGMENT_HINT_PREFIX + segment.getIndex(); Object hintFieldValue = doc.getFieldValue(hintFieldName); segmentHints.load(new ByteArrayInputStream(hintFieldValue.toString().getBytes())); } catch (IOException e) { } // get segment time String segmentTime = segmentHints.getProperty("time"); if (segmentTime == null) throw new IllegalStateException("Found segment without time hint"); segment.setTime(Long.parseLong(segmentTime)); // get segment duration String segmentDuration = segmentHints.getProperty("duration"); if (segmentDuration == null) throw new IllegalStateException("Found segment without duration hint"); segment.setDuration(Long.parseLong(segmentDuration)); // get preview urls for (Map.Entry<Object, Object> entry : segmentHints.entrySet()) { if (entry.getKey().toString().startsWith("preview.")) { String[] parts = entry.getKey().toString().split("\\."); segment.addPreview(entry.getValue().toString(), parts[1]); } } // calculate the segment's relevance with respect to the query String queryText = query.getQuery(); String segmentText = segment.getText(); if (!StringUtils.isBlank(queryText) && !StringUtils.isBlank(segmentText)) { segmentText = segmentText.toLowerCase(); Pattern p = Pattern.compile(".*fulltext:\\(([^)]*)\\).*"); Matcher m = p.matcher(queryText); if (m.matches()) { String[] queryTerms = StringUtils.split(m.group(1).toLowerCase()); int segmentHits = 0; int textLength = segmentText.length(); for (String t : queryTerms) { int startIndex = 0; while (startIndex < textLength - 1) { int foundAt = segmentText.indexOf(t, startIndex); if (foundAt < 0) break; segmentHits++; startIndex = foundAt + t.length(); } } // for now, just store the number of hits, but keep track of the maximum hit count segment.setRelevance(segmentHits); if (segmentHits > maxHits) maxHits = segmentHits; } } segments.add(segment); } for (JaxbMediaSegment segment : segments) { int hitsInSegment = segment.getRelevance(); if (hitsInSegment > 0) segment.setRelevance((int) ((100 * hitsInSegment) / maxHits)); } return segments; }
From source file:org.opencastproject.episode.impl.solr.SolrRequester.java
License:Educational Community License
/** * Creates a search result from a given solr response. * /*from w w w . j a v a2 s . co m*/ * @param query * The solr query. * @return The search result. * @throws SolrServerException * if the solr server is not working as expected */ private SearchResult createSearchResult(final SolrQuery query) throws SolrServerException { // Execute the query and try to get hold of a query response QueryResponse solrResponse = null; try { solrResponse = solrServer.query(query); } catch (Exception e) { throw new SolrServerException(e); } // Create and configure the query result final JaxbSearchResult result = new JaxbSearchResult(query.getQuery()); result.setSearchTime(solrResponse.getQTime()); result.setOffset(solrResponse.getResults().getStart()); result.setLimit(solrResponse.getResults().size()); result.setTotalSize(solrResponse.getResults().getNumFound()); // Walk through response and create new items with title, creator, etc: for (final SolrDocument doc : solrResponse.getResults()) { // Add the item to the result set result.addItem(Convert.convert(doc, query)); } return result; }
From source file:org.opencastproject.search.impl.solr.SolrRequester.java
License:Educational Community License
/** * Creates a search result from a given solr response. * /*from ww w . j av a2 s.c om*/ * @param query * The solr query. * @return The search result. * @throws SolrServerException * if the solr server is not working as expected */ private SearchResult createSearchResult(final SolrQuery query) throws SolrServerException { // Execute the query and try to get hold of a query response QueryResponse solrResponse = null; try { solrResponse = solrServer.query(query); } catch (Exception e) { throw new SolrServerException(e); } // Create and configure the query result final SearchResultImpl result = new SearchResultImpl(query.getQuery()); result.setSearchTime(solrResponse.getQTime()); result.setOffset(solrResponse.getResults().getStart()); result.setLimit(solrResponse.getResults().size()); result.setTotal(solrResponse.getResults().getNumFound()); // Walk through response and create new items with title, creator, etc: for (final SolrDocument doc : solrResponse.getResults()) { final SearchResultItemImpl item = SearchResultItemImpl.fill(new SearchResultItem() { private final String dfltString = null; @Override public String getId() { return Schema.getId(doc); } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getOrganization() */ @Override public String getOrganization() { return Schema.getOrganization(doc); } @Override public MediaPackage getMediaPackage() { MediaPackageBuilder builder = MediaPackageBuilderFactory.newInstance().newMediaPackageBuilder(); String mediaPackageFieldValue = Schema.getOcMediapackage(doc); if (mediaPackageFieldValue != null) { try { return builder.loadFromXml(mediaPackageFieldValue); } catch (Exception e) { logger.warn("Unable to read media package from search result", e); } } return null; } @Override public long getDcExtent() { if (getType().equals(SearchResultItemType.AudioVisual)) { Long extent = Schema.getDcExtent(doc); if (extent != null) return extent; } return -1; } @Override public String getDcTitle() { final List<DField<String>> titles = Schema.getDcTitle(doc); // try to return the first title without any language information first... return head(filter(titles, new Predicate<DField<String>>() { @Override public Boolean apply(DField<String> f) { return f.getSuffix().equals(Schema.LANGUAGE_UNDEFINED); } })).map(new Function<DField<String>, String>() { @Override public String apply(DField<String> f) { return f.getValue(); } }).getOrElse(new Function0<String>() { @Override public String apply() { // ... since none is present return the first arbitrary title return Schema.getFirst(titles, dfltString); } }); } @Override public String getDcSubject() { return Schema.getFirst(Schema.getDcSubject(doc), dfltString); } @Override public String getDcDescription() { return Schema.getFirst(Schema.getDcDescription(doc), dfltString); } @Override public String getDcCreator() { return Schema.getFirst(Schema.getDcCreator(doc), dfltString); } @Override public String getDcPublisher() { return Schema.getFirst(Schema.getDcPublisher(doc), dfltString); } @Override public String getDcContributor() { return Schema.getFirst(Schema.getDcContributor(doc), dfltString); } @Override public String getDcAbstract() { return null; } @Override public Date getDcCreated() { return Schema.getDcCreated(doc); } @Override public Date getDcAvailableFrom() { return Schema.getDcAvailableFrom(doc); } @Override public Date getDcAvailableTo() { return Schema.getDcAvailableTo(doc); } @Override public String getDcLanguage() { return Schema.getDcLanguage(doc); } @Override public String getDcRightsHolder() { return Schema.getFirst(Schema.getDcRightsHolder(doc), dfltString); } @Override public String getDcSpatial() { return Schema.getFirst(Schema.getDcSpatial(doc), dfltString); } @Override public String getDcTemporal() { return null; } @Override public String getDcIsPartOf() { return Schema.getDcIsPartOf(doc); } @Override public String getDcReplaces() { return Schema.getDcReplaces(doc); } @Override public String getDcType() { return Schema.getDcType(doc); } @Override public String getDcAccessRights() { return Schema.getFirst(Schema.getDcAccessRights(doc), dfltString); } @Override public String getDcLicense() { return Schema.getFirst(Schema.getDcLicense(doc), dfltString); } @Override public String getOcMediapackage() { return Schema.getOcMediapackage(doc); } @Override public SearchResultItemType getType() { String t = Schema.getOcMediatype(doc); return t != null ? SearchResultItemType.valueOf(t) : null; } @Override public String[] getKeywords() { if (getType().equals(SearchResultItemType.AudioVisual)) { String k = Schema.getOcKeywords(doc); return k != null ? k.split(" ") : new String[0]; } else return new String[0]; } @Override public String getCover() { return Schema.getOcCover(doc); } @Override public Date getModified() { return Schema.getOcModified(doc); } @Override public double getScore() { return Schema.getScore(doc); } @Override public MediaSegment[] getSegments() { if (SearchResultItemType.AudioVisual.equals(getType())) return createSearchResultSegments(doc, query).toArray(new MediaSegmentImpl[0]); else return new MediaSegmentImpl[0]; } }); // Add the item to the result set result.addItem(item); } return result; }
From source file:org.opencastproject.search.impl.solr.SolrRequester.java
License:Educational Community License
/** * Creates a list of <code>MediaSegment</code>s from the given result document. * // w w w . j a va2 s. c o m * @param doc * the result document * @param query * the original query */ private List<MediaSegmentImpl> createSearchResultSegments(SolrDocument doc, SolrQuery query) { List<MediaSegmentImpl> segments = new ArrayList<MediaSegmentImpl>(); // The maximum number of hits in a segment int maxHits = 0; // Loop over every segment for (String fieldName : doc.getFieldNames()) { if (!fieldName.startsWith(Schema.SEGMENT_TEXT_PREFIX)) continue; // Ceate a new segment int segmentId = Integer.parseInt(fieldName.substring(Schema.SEGMENT_TEXT_PREFIX.length())); MediaSegmentImpl segment = new MediaSegmentImpl(segmentId); segment.setText(mkString(doc.getFieldValue(fieldName))); // Read the hints for this segment Properties segmentHints = new Properties(); try { String hintFieldName = Schema.SEGMENT_HINT_PREFIX + segment.getIndex(); Object hintFieldValue = doc.getFieldValue(hintFieldName); segmentHints.load(new ByteArrayInputStream(hintFieldValue.toString().getBytes())); } catch (IOException e) { logger.warn("Cannot load hint properties."); } // get segment time String segmentTime = segmentHints.getProperty("time"); if (segmentTime == null) throw new IllegalStateException("Found segment without time hint"); segment.setTime(Long.parseLong(segmentTime)); // get segment duration String segmentDuration = segmentHints.getProperty("duration"); if (segmentDuration == null) throw new IllegalStateException("Found segment without duration hint"); segment.setDuration(Long.parseLong(segmentDuration)); // get preview urls for (Entry<Object, Object> entry : segmentHints.entrySet()) { if (entry.getKey().toString().startsWith("preview.")) { String[] parts = entry.getKey().toString().split("\\."); segment.addPreview(entry.getValue().toString(), parts[1]); } } // calculate the segment's relevance with respect to the query String queryText = query.getQuery(); String segmentText = segment.getText(); if (!StringUtils.isBlank(queryText) && !StringUtils.isBlank(segmentText)) { segmentText = segmentText.toLowerCase(); Pattern p = Pattern.compile(".*fulltext:\\(([^)]*)\\).*"); Matcher m = p.matcher(queryText); if (m.matches()) { String[] queryTerms = StringUtils.split(m.group(1).toLowerCase()); int segmentHits = 0; int textLength = segmentText.length(); for (String t : queryTerms) { String strippedTerm = StringUtils.strip(t, "*"); int startIndex = 0; while (startIndex < textLength - 1) { int foundAt = segmentText.indexOf(strippedTerm, startIndex); if (foundAt < 0) break; segmentHits++; startIndex = foundAt + strippedTerm.length(); } } // for now, just store the number of hits, but keep track of the maximum hit count if (segmentHits > 0) { segment.setHit(true); segment.setRelevance(segmentHits); } if (segmentHits > maxHits) maxHits = segmentHits; } } segments.add(segment); } for (MediaSegmentImpl segment : segments) { int hitsInSegment = segment.getRelevance(); if (hitsInSegment > 0) segment.setRelevance((int) ((100 * hitsInSegment) / maxHits)); } return segments; }
From source file:org.opencb.commons.datastore.solr.SolrCollection.java
License:Apache License
public FacetQueryResult facet(SolrQuery solrQuery, Map<String, String> alias, FacetPostprocessing post) throws IOException, SolrServerException { logger.debug("Executing Solr facet: {}", solrQuery.toString()); StopWatch stopWatch = StopWatch.createStarted(); QueryResponse query = solrClient.query(collection, solrQuery); if (post != null) { query = post.apply(query);// ww w . j av a 2 s. c o m } List<FacetQueryResult.Field> results = SolrFacetToFacetQueryResultItemConverter.convert(query, alias); int dbTime = (int) stopWatch.getTime(TimeUnit.MILLISECONDS); return new FacetQueryResult("Faceted data from Solr", dbTime, results.size(), Collections.emptyList(), null, results, solrQuery.getQuery()); }
From source file:org.opencms.search.solr.CmsSolrIndex.java
License:Open Source License
/** * Performs the actual search.<p>/*from www . j ava 2 s . c o m*/ * * @param cms the current OpenCms context * @param ignoreMaxRows <code>true</code> to return all all requested rows, <code>false</code> to use max rows * @param query the OpenCms Solr query * @param response the servlet response to write the query result to, may also be <code>null</code> * @param ignoreSearchExclude if set to false, only contents with search_exclude unset or "false" will be found - typical for the the non-gallery case * @param filter the resource filter to use * * @return the found documents * * @throws CmsSearchException if something goes wrong * * @see #search(CmsObject, CmsSolrQuery, boolean) */ @SuppressWarnings("unchecked") public CmsSolrResultList search(CmsObject cms, final CmsSolrQuery query, boolean ignoreMaxRows, ServletResponse response, boolean ignoreSearchExclude, CmsResourceFilter filter) throws CmsSearchException { // check if the user is allowed to access this index checkOfflineAccess(cms); if (!ignoreSearchExclude) { query.addFilterQuery(CmsSearchField.FIELD_SEARCH_EXCLUDE + ":\"false\""); } int previousPriority = Thread.currentThread().getPriority(); long startTime = System.currentTimeMillis(); // remember the initial query SolrQuery initQuery = query.clone(); query.setHighlight(false); LocalSolrQueryRequest solrQueryRequest = null; try { // initialize the search context CmsObject searchCms = OpenCms.initCmsObject(cms); // change thread priority in order to reduce search impact on overall system performance if (getPriority() > 0) { Thread.currentThread().setPriority(getPriority()); } // the lists storing the found documents that will be returned List<CmsSearchResource> resourceDocumentList = new ArrayList<CmsSearchResource>(); SolrDocumentList solrDocumentList = new SolrDocumentList(); // Initialize rows, offset, end and the current page. int rows = query.getRows() != null ? query.getRows().intValue() : CmsSolrQuery.DEFAULT_ROWS.intValue(); if (!ignoreMaxRows && (rows > ROWS_MAX)) { rows = ROWS_MAX; } int start = query.getStart() != null ? query.getStart().intValue() : 0; int end = start + rows; int page = 0; if (rows > 0) { page = Math.round(start / rows) + 1; } // set the start to '0' and expand the rows before performing the query query.setStart(new Integer(0)); query.setRows(new Integer((5 * rows * page) + start)); // perform the Solr query and remember the original Solr response QueryResponse queryResponse = m_solr.query(query); long solrTime = System.currentTimeMillis() - startTime; // initialize the counts long hitCount = queryResponse.getResults().getNumFound(); start = -1; end = -1; if ((rows > 0) && (page > 0) && (hitCount > 0)) { // calculate the final size of the search result start = rows * (page - 1); end = start + rows; // ensure that both i and n are inside the range of foundDocuments.size() start = new Long((start > hitCount) ? hitCount : start).intValue(); end = new Long((end > hitCount) ? hitCount : end).intValue(); } else { // return all found documents in the search result start = 0; end = new Long(hitCount).intValue(); } long visibleHitCount = hitCount; float maxScore = 0; // If we're using a postprocessor, (re-)initialize it before using it if (m_postProcessor != null) { m_postProcessor.init(); } // process found documents List<CmsSearchResource> allDocs = new ArrayList<CmsSearchResource>(); int cnt = 0; for (int i = 0; (i < queryResponse.getResults().size()) && (cnt < end); i++) { try { SolrDocument doc = queryResponse.getResults().get(i); CmsSolrDocument searchDoc = new CmsSolrDocument(doc); if (needsPermissionCheck(searchDoc)) { // only if the document is an OpenCms internal resource perform the permission check CmsResource resource = filter == null ? getResource(searchCms, searchDoc) : getResource(searchCms, searchDoc, filter); if (resource != null) { // permission check performed successfully: the user has read permissions! if (cnt >= start) { if (m_postProcessor != null) { doc = m_postProcessor.process(searchCms, resource, (SolrInputDocument) searchDoc.getDocument()); } resourceDocumentList.add(new CmsSearchResource(resource, searchDoc)); if (null != doc) { solrDocumentList.add(doc); } maxScore = maxScore < searchDoc.getScore() ? searchDoc.getScore() : maxScore; } allDocs.add(new CmsSearchResource(resource, searchDoc)); cnt++; } else { visibleHitCount--; } } else { // if permission check is not required for this index, // add a pseudo resource together with document to the results resourceDocumentList.add(new CmsSearchResource(PSEUDO_RES, searchDoc)); solrDocumentList.add(doc); maxScore = maxScore < searchDoc.getScore() ? searchDoc.getScore() : maxScore; cnt++; } } catch (Exception e) { // should not happen, but if it does we want to go on with the next result nevertheless LOG.warn(Messages.get().getBundle().key(Messages.LOG_SOLR_ERR_RESULT_ITERATION_FAILED_0), e); } } // the last documents were all secret so let's take the last found docs if (resourceDocumentList.isEmpty() && (allDocs.size() > 0)) { page = Math.round(allDocs.size() / rows) + 1; int showCount = allDocs.size() % rows; showCount = showCount == 0 ? rows : showCount; start = allDocs.size() - new Long(showCount).intValue(); end = allDocs.size(); if (allDocs.size() > start) { resourceDocumentList = allDocs.subList(start, end); for (CmsSearchResource r : resourceDocumentList) { maxScore = maxScore < r.getDocument().getScore() ? r.getDocument().getScore() : maxScore; solrDocumentList.add(((CmsSolrDocument) r.getDocument()).getSolrDocument()); } } } long processTime = System.currentTimeMillis() - startTime - solrTime; // create and return the result solrDocumentList.setStart(start); solrDocumentList.setMaxScore(new Float(maxScore)); solrDocumentList.setNumFound(visibleHitCount); queryResponse.getResponse().setVal(queryResponse.getResponse().indexOf(QUERY_RESPONSE_NAME, 0), solrDocumentList); queryResponse.getResponseHeader().setVal(queryResponse.getResponseHeader().indexOf(QUERY_TIME_NAME, 0), new Integer(new Long(System.currentTimeMillis() - startTime).intValue())); long highlightEndTime = System.currentTimeMillis(); SolrCore core = m_solr instanceof EmbeddedSolrServer ? ((EmbeddedSolrServer) m_solr).getCoreContainer().getCore(getCoreName()) : null; CmsSolrResultList result = null; try { SearchComponent highlightComponenet = null; if (core != null) { highlightComponenet = core.getSearchComponent("highlight"); solrQueryRequest = new LocalSolrQueryRequest(core, queryResponse.getResponseHeader()); } SolrQueryResponse solrQueryResponse = null; if (solrQueryRequest != null) { // create and initialize the solr response solrQueryResponse = new SolrQueryResponse(); solrQueryResponse.setAllValues(queryResponse.getResponse()); int paramsIndex = queryResponse.getResponseHeader().indexOf(HEADER_PARAMS_NAME, 0); NamedList<Object> header = null; Object o = queryResponse.getResponseHeader().getVal(paramsIndex); if (o instanceof NamedList) { header = (NamedList<Object>) o; header.setVal(header.indexOf(CommonParams.ROWS, 0), new Integer(rows)); header.setVal(header.indexOf(CommonParams.START, 0), new Long(start)); } // set the OpenCms Solr query as parameters to the request solrQueryRequest.setParams(initQuery); // perform the highlighting if ((header != null) && (initQuery.getHighlight()) && (highlightComponenet != null)) { header.add(HighlightParams.HIGHLIGHT, "on"); if ((initQuery.getHighlightFields() != null) && (initQuery.getHighlightFields().length > 0)) { header.add(HighlightParams.FIELDS, CmsStringUtil.arrayAsString(initQuery.getHighlightFields(), ",")); } String formatter = initQuery.getParams(HighlightParams.FORMATTER) != null ? initQuery.getParams(HighlightParams.FORMATTER)[0] : null; if (formatter != null) { header.add(HighlightParams.FORMATTER, formatter); } if (initQuery.getHighlightFragsize() != 100) { header.add(HighlightParams.FRAGSIZE, new Integer(initQuery.getHighlightFragsize())); } if (initQuery.getHighlightRequireFieldMatch()) { header.add(HighlightParams.FIELD_MATCH, new Boolean(initQuery.getHighlightRequireFieldMatch())); } if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(initQuery.getHighlightSimplePost())) { header.add(HighlightParams.SIMPLE_POST, initQuery.getHighlightSimplePost()); } if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(initQuery.getHighlightSimplePre())) { header.add(HighlightParams.SIMPLE_PRE, initQuery.getHighlightSimplePre()); } if (initQuery.getHighlightSnippets() != 1) { header.add(HighlightParams.SNIPPETS, new Integer(initQuery.getHighlightSnippets())); } ResponseBuilder rb = new ResponseBuilder(solrQueryRequest, solrQueryResponse, Collections.singletonList(highlightComponenet)); try { rb.doHighlights = true; DocListAndSet res = new DocListAndSet(); SchemaField idField = OpenCms.getSearchManager().getSolrServerConfiguration() .getSolrSchema().getUniqueKeyField(); int[] luceneIds = new int[rows]; int docs = 0; for (SolrDocument doc : solrDocumentList) { String idString = (String) doc.getFirstValue(CmsSearchField.FIELD_ID); int id = solrQueryRequest.getSearcher().getFirstMatch( new Term(idField.getName(), idField.getType().toInternal(idString))); luceneIds[docs++] = id; } res.docList = new DocSlice(0, docs, luceneIds, null, docs, 0); rb.setResults(res); rb.setQuery(QParser.getParser(initQuery.getQuery(), null, solrQueryRequest).getQuery()); rb.setQueryString(initQuery.getQuery()); highlightComponenet.prepare(rb); highlightComponenet.process(rb); highlightComponenet.finishStage(rb); } catch (Exception e) { LOG.error(e.getMessage() + " in query: " + initQuery, new Exception(e)); } // Make highlighting also available via the CmsSolrResultList queryResponse.setResponse(solrQueryResponse.getValues()); highlightEndTime = System.currentTimeMillis(); } } result = new CmsSolrResultList(initQuery, queryResponse, solrDocumentList, resourceDocumentList, start, new Integer(rows), end, page, visibleHitCount, new Float(maxScore), startTime, highlightEndTime); if (LOG.isDebugEnabled()) { Object[] logParams = new Object[] { new Long(System.currentTimeMillis() - startTime), new Long(result.getNumFound()), new Long(solrTime), new Long(processTime), new Long(result.getHighlightEndTime() != 0 ? result.getHighlightEndTime() - startTime : 0) }; LOG.debug(query.toString() + "\n" + Messages.get().getBundle().key(Messages.LOG_SOLR_SEARCH_EXECUTED_5, logParams)); } if (response != null) { writeResp(response, solrQueryRequest, solrQueryResponse); } } finally { if (solrQueryRequest != null) { solrQueryRequest.close(); } if (core != null) { core.close(); } } return result; } catch (Exception e) { throw new CmsSearchException(Messages.get().container(Messages.LOG_SOLR_ERR_SEARCH_EXECUTION_FAILD_1, CmsEncoder.decode(query.toString()), e), e); } finally { if (solrQueryRequest != null) { solrQueryRequest.close(); } // re-set thread to previous priority Thread.currentThread().setPriority(previousPriority); } }
From source file:org.opencommercesearch.AbstractSearchServer.java
License:Apache License
private SearchResponse doSearch(SolrQuery query, Site site, RepositoryItem catalog, Locale locale, boolean isSearch, boolean isRuleBasedPage, String categoryPath, boolean isOutletPage, String brandId, FilterQuery... filterQueries) throws SearchServerException { if (site == null) { throw new IllegalArgumentException("Missing site"); }/*from w w w. j a v a2 s. c o m*/ if (catalog == null) { throw new IllegalArgumentException("Missing catalog"); } long startTime = System.currentTimeMillis(); query.addFacetField("category"); query.set("facet.mincount", 1); RuleManager ruleManager = new RuleManager(getSearchRepository(), getRulesBuilder(), getRulesSolrServer(locale)); if ((query.getRows() != null && query.getRows() > 0) || (query.get("group") != null && query.getBool("group"))) { setGroupParams(query, locale); setFieldListParams(query, locale.getCountry(), catalog.getRepositoryId()); try { ruleManager.setRuleParams(query, isSearch, isRuleBasedPage, categoryPath, filterQueries, catalog, isOutletPage, brandId); if (ruleManager.getRules().containsKey(SearchRepositoryItemDescriptor.REDIRECT_RULE)) { Map<String, List<RepositoryItem>> rules = ruleManager.getRules(); List<RepositoryItem> redirects = rules.get(SearchRepositoryItemDescriptor.REDIRECT_RULE); if (redirects != null) { RepositoryItem redirect = redirects.get(0); return new SearchResponse(query, null, null, null, (String) redirect.getPropertyValue(RedirectRuleProperty.URL), null, true); } } } catch (RepositoryException ex) { if (isLoggingError()) { logError("Unable to load search rules: " + ex.getMessage()); } throw create(SEARCH_EXCEPTION, ex); } catch (SolrServerException ex) { if (isLoggingError()) { logError("Unable to load search rules: " + ex.getMessage()); } throw create(SEARCH_EXCEPTION, ex); } catch (SolrException ex) { if (isLoggingError()) { logError("Unable to load search rules: " + ex.getMessage()); } throw create(SEARCH_EXCEPTION, ex); } } else { ruleManager.setFilterQueries(filterQueries, catalog.getRepositoryId(), query); } try { QueryResponse queryResponse = getCatalogSolrServer(locale).query(query); String correctedTerm = null; boolean matchesAll = true; //if no results, check for spelling errors if (query.getRows() > 0 && isEmptySearch(queryResponse.getGroupResponse()) && StringUtils.isNotEmpty(query.getQuery())) { SpellCheckResponse spellCheckResponse = queryResponse.getSpellCheckResponse(); //try to do searching for the corrected term matching all terms (q.op=AND) QueryResponse tentativeResponse = handleSpellCheck(spellCheckResponse, getCatalogSolrServer(locale), query, "AND"); if (tentativeResponse != null) { //if we got results, set the corrected term variable and proceed to return the results queryResponse = tentativeResponse; correctedTerm = spellCheckResponse.getCollatedResult(); } else { //if we didn't got any response, try doing another search matching any term (q.op=OR) tentativeResponse = handleSpellCheck(spellCheckResponse, getCatalogSolrServer(locale), query, "OR"); if (tentativeResponse != null) { //if we got results for the match any term scenario. Set similar results to true //and set the corrected term. queryResponse = tentativeResponse; matchesAll = false; correctedTerm = query.getQuery(); } } } long searchTime = System.currentTimeMillis() - startTime; if (isLoggingDebug()) { logDebug("Search time is " + searchTime + ", search engine time is " + queryResponse.getQTime()); } SearchResponse searchResponse = new SearchResponse(query, queryResponse, ruleManager, filterQueries, null, correctedTerm, matchesAll); searchResponse.setRuleQueryTime(ruleManager.getLoadRulesTime()); return searchResponse; } catch (SolrServerException ex) { throw create(SEARCH_EXCEPTION, ex); } catch (SolrException ex) { throw create(SEARCH_EXCEPTION, ex); } }