Example usage for org.apache.solr.client.solrj SolrQuery setHighlightSnippets

List of usage examples for org.apache.solr.client.solrj SolrQuery setHighlightSnippets

Introduction

In this page you can find the example usage for org.apache.solr.client.solrj SolrQuery setHighlightSnippets.

Prototype

public SolrQuery setHighlightSnippets(int num) 

Source Link

Usage

From source file:com.doculibre.constellio.services.FacetServicesImpl.java

License:Open Source License

public static SolrQuery toSolrQuery(SimpleSearch simpleSearch, int start, int row,
        boolean includeSingleValueFacets, boolean notIncludedOnly, List<String> customFieldFacets,
        List<String> customQueryFacets, ConstellioUser user) {
    String solrServerName = simpleSearch.getCollectionName();
    RecordCollectionServices collectionServices = ConstellioSpringUtils.getRecordCollectionServices();
    RecordCollection collection = collectionServices.get(solrServerName);
    SolrServices solrServices = ConstellioSpringUtils.getSolrServices();
    Boolean usesDisMax = solrServices.usesDisMax(collection);
    SolrQuery query;
    if (!collection.isOpenSearch()) {
        query = SearchServicesImpl.toSolrQuery(simpleSearch, usesDisMax, true, includeSingleValueFacets,
                notIncludedOnly);/*from ww  w  .ja v a  2 s  .  com*/
    } else {
        query = SearchServicesImpl.toSolrQuery(simpleSearch, usesDisMax, false, true, false);
    }

    query.setParam(ConstellioSolrQueryParams.COLLECTION_NAME, simpleSearch.getCollectionName());
    query.setParam(ConstellioSolrQueryParams.LUCENE_QUERY,
            simpleSearch.getLuceneQuery(includeSingleValueFacets, true));
    query.setParam(ConstellioSolrQueryParams.SIMPLE_SEARCH, simpleSearch.toSimpleParams().toString());
    if (user != null) {
        query.setParam(ConstellioSolrQueryParams.USER_ID, "" + user.getId());
    }

    if (StringUtils.isEmpty(query.getQuery())) {
        query.setQuery(SimpleSearch.SEARCH_ALL);
        query.setRequestHandler("/elevate");
    }

    query.set("shards.qt", "/elevate");
    query.setRequestHandler("/elevate");

    query.setRows(row);
    query.setStart(start);
    query.setHighlight(true);
    query.setHighlightFragsize(100);
    query.setHighlightSnippets(2);

    query.setFacet(true);
    query.setFacetLimit(400);
    query.setFacetMinCount(1);

    if (collection.isOpenSearch()) {
        query.setParam("openSearchURL", collection.getOpenSearchURL());
        Locale locale = simpleSearch.getSingleSearchLocale();
        if (locale != null) {
            query.setParam("lang", locale.getLanguage());
        }
    } else {
        for (CollectionFacet collectionFacet : collection.getCollectionFacets()) {
            if (customFieldFacets == null && collectionFacet.isFieldFacet()) {
                IndexField indexField = collectionFacet.getFacetField();
                String indexFieldName = indexField.getName();
                if (!notIncludedOnly) {
                    query.addFacetField(indexFieldName);
                } else {
                    SearchedFacet searchedFacet = simpleSearch.getSearchedFacet(indexFieldName);
                    if (searchedFacet != null) {
                        if (!searchedFacet.getIncludedValues().isEmpty()) {
                            StringBuffer sbEx = new StringBuffer();
                            sbEx.append("{!ex=dt}");
                            //                                sbEx.append("{!ex=");
                            //                                boolean first = true;
                            //                                for (String includedValue : searchedFacet.getIncludedValues()) {
                            //                                    if (first) {
                            //                                        first = false;
                            //                                    } else {
                            //                                        sbEx.append(",");
                            //                                    }
                            //                                    sbEx.append(includedValue); 
                            //                                }
                            //                                sbEx.append("}");
                            //                                query.setParam("facet.field", sbEx.toString() + indexFieldName);
                            query.addFacetField(sbEx.toString() + indexFieldName);
                        } else {
                            query.addFacetField(indexFieldName);
                        }
                    }
                }
            } else if (customQueryFacets == null && collectionFacet.isQueryFacet()) {
                // Modification Rida, remplacement de collectionFacet.getLabels() par
                // collectionFacet.getLabelledValues()
                // for (I18NLabel valueLabels : collectionFacet.getLabels()) {
                for (I18NLabel valueLabels : collectionFacet.getLabelledValues()) {
                    String facetQuery = valueLabels.getKey();
                    query.addFacetQuery(facetQuery);
                }
            }
        }
        if (customFieldFacets != null) {
            for (String facetField : customFieldFacets) {
                if (!notIncludedOnly) {
                    query.addFacetField(facetField);
                } else {
                    StringBuffer sbEx = new StringBuffer();
                    sbEx.append("{!ex=dt}");
                    //                        sbEx.append("{!ex=");
                    //                        boolean first = true;
                    //                        for (String includedValue : searchedFacet.getIncludedValues()) {
                    //                            if (first) {
                    //                                first = false;
                    //                            } else {
                    //                                sbEx.append(",");
                    //                            }
                    //                            sbEx.append(includedValue); 
                    //                        }
                    //                        sbEx.append("}");
                    query.setParam("facet.field", sbEx.toString() + facetField);
                }
            }
        }

        if (customQueryFacets != null) {
            for (String facetQuery : customQueryFacets) {
                query.addFacetQuery(facetQuery);
            }
        }
    }

    return query;
}

From source file:com.doculibre.constellio.services.SearchServicesImpl.java

License:Open Source License

@Override
public QueryResponse search(SimpleSearch simpleSearch, int start, int rows, SearchParams searchParams,
        ConstellioUser user) {/*from  w  ww.  ja  va  2s .  c  o m*/
    QueryResponse queryResponse;

    String collectionName = simpleSearch.getCollectionName();
    if (collectionName != null) {
        RecordCollectionServices collectionServices = ConstellioSpringUtils.getRecordCollectionServices();
        RecordServices recordServices = ConstellioSpringUtils.getRecordServices();
        RecordCollection collection = collectionServices.get(collectionName);

        SolrServices solrServices = ConstellioSpringUtils.getSolrServices();
        Boolean usesDisMax = solrServices.usesDisMax(collection);

        SolrQuery query;
        if (!collection.isOpenSearch()) {
            query = toSolrQuery(simpleSearch, usesDisMax, true, true);
        } else {
            query = toSolrQuery(simpleSearch, usesDisMax, false, true);
        }
        // displayQuery(query);

        String luceneQuery = simpleSearch.getLuceneQuery();
        query.setParam(ConstellioSolrQueryParams.LUCENE_QUERY, luceneQuery);
        query.setParam(ConstellioSolrQueryParams.SIMPLE_SEARCH, simpleSearch.toSimpleParams().toString());
        query.setParam(ConstellioSolrQueryParams.COLLECTION_NAME, collectionName);
        if (user != null) {
            query.setParam(ConstellioSolrQueryParams.USER_ID, "" + user.getId());
        }

        String queryString = query.getQuery();
        if (StringUtils.isEmpty(queryString)) {
            queryString = SimpleSearch.SEARCH_ALL;
        }

        List<Record> pendingExclusions = recordServices.getPendingExclusions(collection);
        while (!pendingExclusions.isEmpty()) {
            IndexingManager indexingManager = IndexingManager.get(collection);
            if (indexingManager.isActive()) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                pendingExclusions = recordServices.getPendingExclusions(collection);
            } else {
                return null;
            }
        }

        // SolrQuery query = new SolrQuery();
        query.set("collectionName", simpleSearch.getCollectionName());
        // query.setQuery(luceneQuery);

        query.set("shards.qt", "/elevate");
        query.setRequestHandler("/elevate");

        // nb rsultats par page
        query.setRows(rows);

        // page de dbut
        query.setStart(start);
        query.setHighlight(searchParams.isHighlightingEnabled());
        if (searchParams.isHighlightingEnabled()) {
            query.setHighlightFragsize(searchParams.getFragsize());
            query.setHighlightSnippets(searchParams.getSnippets());
        }

        if (simpleSearch.getSortField() != null) {
            ORDER order = SimpleSearch.SORT_DESCENDING.equals(simpleSearch.getSortOrder()) ? ORDER.desc
                    : ORDER.asc;
            IndexFieldServices indexFieldServices = ConstellioSpringUtils.getIndexFieldServices();
            IndexField indexField = indexFieldServices.get(simpleSearch.getSortField(), collection);
            if (indexField != null) {
                IndexField sortIndexField = indexFieldServices.getSortFieldOf(indexField);
                if (sortIndexField != null) {
                    query.setSort(sortIndexField.getName(), order);
                }
            }
        }

        if (collection.isOpenSearch()) {
            query.setParam("openSearchURL", collection.getOpenSearchURL());
            Locale locale = simpleSearch.getSingleSearchLocale();
            if (locale != null) {
                query.setParam("lang", locale.getLanguage());
            }
        }

        if (searchParams.getHighlightedFields() == null) {
            IndexField defaultSearchField = collection.getDefaultSearchIndexField();
            query.addHighlightField(defaultSearchField.getName());
            for (CopyField copyFieldDest : defaultSearchField.getCopyFieldsDest()) {
                IndexField copyIndexFieldSource = copyFieldDest.getIndexFieldSource();
                if (copyIndexFieldSource != null && !copyIndexFieldSource.isTitleField()
                        && copyIndexFieldSource.isHighlighted()) {
                    query.addHighlightField(copyIndexFieldSource.getName());
                }
            }
            IndexField titleField = collection.getTitleIndexField();
            if (titleField != null && titleField.isHighlighted()) {
                query.addHighlightField(titleField.getName());
            }
        } else {
            for (String highlightedField : searchParams.getHighlightedFields()) {
                IndexField field = collection.getIndexField(highlightedField);
                if (field != null) {
                    query.addHighlightField(highlightedField);
                }
            }
        }
        SolrServer server = SolrCoreContext.getSolrServer(collectionName);
        if (server != null) {
            try {
                // displayQuery(query);
                queryResponse = server.query(query);
            } catch (SolrServerException e) {
                queryResponse = null;
            }
        } else {
            queryResponse = null;
        }

        //            if (queryResponse != null && !collection.isOpenSearch()) {
        //                StatsCompiler statCompiler = StatsCompiler.getInstance();
        //                try {
        //                    statCompiler.saveStats(collectionName, SolrLogContext.getStatsSolrServer(),
        //                        SolrLogContext.getStatsCompileSolrServer(), queryResponse, luceneQuery);
        //                } catch (SolrServerException e) {
        //                    throw new RuntimeException(e);
        //                } catch (IOException e) {
        //                    throw new RuntimeException(e);
        //                }
        //            }

    } else {
        queryResponse = null;
    }

    // improveQueryResponse(collectionName, queryResponse);
    // System.out.println("Response size" + queryResponse.getResults().getNumFound());
    return queryResponse;
}

From source file:com.liferay.portal.search.solr.internal.SolrIndexSearcher.java

License:Open Source License

protected void addHighlights(SolrQuery solrQuery, QueryConfig queryConfig) {
    if (!queryConfig.isHighlightEnabled()) {
        return;/*from   w  w w. j  ava 2s.c o m*/
    }

    solrQuery.setHighlight(true);
    solrQuery.setHighlightFragsize(queryConfig.getHighlightFragmentSize());
    solrQuery.setHighlightSimplePost(HighlightUtil.HIGHLIGHT_TAG_CLOSE);
    solrQuery.setHighlightSimplePre(HighlightUtil.HIGHLIGHT_TAG_OPEN);
    solrQuery.setHighlightSnippets(queryConfig.getHighlightSnippetSize());

    for (String highlightFieldName : queryConfig.getHighlightFieldNames()) {
        addHighlightedField(solrQuery, queryConfig, highlightFieldName);
    }

    solrQuery.setHighlightRequireFieldMatch(queryConfig.isHighlightRequireFieldMatch());
}

From source file:com.liferay.portal.search.solr.SolrIndexSearcher.java

License:Open Source License

protected void addHighlights(SolrQuery solrQuery, QueryConfig queryConfig) {
    if (!queryConfig.isHighlightEnabled()) {
        return;/*from   w w  w  . j a va 2s .  c om*/
    }

    solrQuery.setHighlight(true);
    solrQuery.setHighlightFragsize(queryConfig.getHighlightFragmentSize());
    solrQuery.setHighlightSimplePost(SearchUtil.HIGHLIGHT_TAG_CLOSE);
    solrQuery.setHighlightSimplePre(SearchUtil.HIGHLIGHT_TAG_OPEN);
    solrQuery.setHighlightSnippets(queryConfig.getHighlightSnippetSize());

    for (String highlightFieldName : queryConfig.getHighlightFieldNames()) {
        addHighlightedField(solrQuery, queryConfig, highlightFieldName);
    }

    solrQuery.setHighlightRequireFieldMatch(queryConfig.isHighlightRequireFieldMatch());
}

From source file:com.liferay.portal.search.solr.SolrIndexSearcherImpl.java

License:Open Source License

protected SolrQuery translateQuery(long companyId, Query query, Sort[] sorts, int start, int end)
        throws Exception {

    QueryTranslatorUtil.translateForSolr(query);

    String queryString = query.toString();

    QueryConfig queryConfig = query.getQueryConfig();

    SolrQuery solrQuery = new SolrQuery();

    solrQuery.setHighlight(queryConfig.isHighlightEnabled());
    solrQuery.setHighlightFragsize(queryConfig.getHighlightFragmentSize());
    solrQuery.setHighlightSnippets(queryConfig.getHighlightSnippetSize());
    solrQuery.setIncludeScore(queryConfig.isScoreEnabled());
    solrQuery.setQuery(queryString);/*from   w  w w  . j a v  a  2  s. co m*/

    if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS)) {
        solrQuery.setRows(0);
    } else {
        solrQuery.setRows(end - start);
        solrQuery.setStart(start);
    }

    if ((sorts != null) && (sorts.length > 0)) {
        for (Sort sort : sorts) {
            if (sort == null) {
                continue;
            }

            String sortFieldName = sort.getFieldName();

            if (ArrayUtil.contains(PortletPropsValues.SOLR_SORTABLE_TEXT_FIELDS, sortFieldName)) {

                sortFieldName = GetterUtil.getString(
                        PortletProps.get(PortletPropsKeys.SOLR_COPY_FIELDS, new Filter(sortFieldName)));
            }

            ORDER order = ORDER.asc;

            if (sortFieldName == null) {
                sortFieldName = "score";

                order = ORDER.desc;
            } else if (sort.isReverse()) {
                order = ORDER.desc;
            }

            solrQuery.addSortField(sortFieldName, order);
        }
    }

    return solrQuery;
}

From source file:com.seajas.search.attender.service.search.SolrSearchService.java

License:Open Source License

/**
 * {@inheritDoc}/*from  w w  w  . ja v a 2 s  .  co m*/
 */
@Override
public List<SearchResult> performSearch(final String query, final Date startDate, final Date endDate,
        final Map<String, String> parameters, final Integer maxResults, final String taxonomyLanguage) {
    List<SearchResult> results = new ArrayList<SearchResult>(maxResults);

    SolrQuery solrQuery = new SolrQuery();
    SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

    // Combine the shards into a Solr-acceptable list

    String shardList = "";

    for (String shard : shards)
        shardList += (shardList.length() > 0 ? "," : "") + shard;

    solrQuery.setQuery(query);
    solrQuery.setRows(maxResults);
    solrQuery.setParam("shards", shardList);
    solrQuery.addFilterQuery("dcterms_created:[" + dateFormatter.format(startDate) + " TO "
            + dateFormatter.format(endDate) + "]");

    // Construct a field list for highlighting

    String[] fieldList = new String[(searchLanguages.size() * 2) + 2];

    fieldList[0] = "content";
    fieldList[1] = "title";

    for (int i = 2, j = 0; i < fieldList.length; i += 2, j++) {
        fieldList[i] = "content-" + searchLanguages.get(j);
        fieldList[i + 1] = "title-" + searchLanguages.get(j);
    }

    // Enable highlighting for the content (and leaving the title for now)

    solrQuery.setHighlight(true);
    solrQuery.setHighlightSnippets(2);
    solrQuery.setParam("hl.fl", fieldList);

    solrQuery.setParam("f.title.hl.fragsize", "0");
    solrQuery.setParam("f.content.hl.fragsize", "100");

    for (String language : searchLanguages) {
        solrQuery.setParam("f.title-" + language + ".hl.fragsize", "0");
        solrQuery.setParam("f.content-" + language + ".hl.fragsize", "100");
    }

    for (Entry<String, String> parameter : parameters.entrySet()) {
        if (parameter.getKey().equalsIgnoreCase("dcterms_coverage")
                || parameter.getKey().equalsIgnoreCase("dcterms_format"))
            solrQuery.addFilterQuery(parameter.getKey() + ":(" + parameter.getValue() + ")");
        else if (parameter.getKey().equalsIgnoreCase("dcterms_type"))
            solrQuery.addFilterQuery("-" + parameter.getKey() + ":(" + parameter.getValue() + ")");
        else
            solrQuery.addFilterQuery(parameter.getKey() + ":\"" + parameter.getValue() + "\"");
    }

    try {
        QueryResponse response = solrServer.query(solrQuery);
        Iterator<SolrDocument> iterator = response.getResults().iterator();

        for (int i = 0; i < maxResults && iterator.hasNext(); i++) {
            SolrDocument document = iterator.next();

            // Retrieve the (potentially) highlighted summary

            String id = (String) document.getFieldValue("id");
            String language = (String) document.getFieldValue("dcterms_language");
            String author = (String) document.getFieldValue("author");
            String sourceId = null;

            // Simply take the last source ID

            if (document.getFieldValues("dcterms_coverage") != null
                    && document.getFieldValues("dcterms_coverage").size() > 0)
                for (Object coverageId : document.getFieldValues("dcterms_coverage"))
                    sourceId = coverageId.toString();

            String contentField = StringUtils.hasText(language) ? "content-" + language : "content";
            String titleField = StringUtils.hasText(language) ? "title-" + language : "title";

            String summary = (String) document.getFieldValue(contentField);

            if (summary.length() > 300)
                summary = summary.substring(0, 300) + " &hellip;";

            if (response.getHighlighting().get(id) != null) {
                List<String> highlightSnippets = response.getHighlighting().get(id).get(contentField);

                if (highlightSnippets != null && highlightSnippets.size() > 0) {
                    String fragmentPrefixOne = highlightSnippets.get(0).length() > 99 ? " .. " : "";

                    summary = fragmentPrefixOne + highlightSnippets.get(0) + fragmentPrefixOne;

                    if (highlightSnippets.size() > 1) {
                        String fragmentSuffixTwo = highlightSnippets.get(1).length() > 99 ? " .. " : "";

                        summary += highlightSnippets.get(1) + fragmentSuffixTwo;
                    }
                }
            }

            results.add(new SearchResult((String) document.get("url"), (String) document.get(titleField),
                    author, sourceId, summary, (Date) document.get("dcterms_created"),
                    (String) document.get("dcterms_alternative")));
        }
    } catch (SolrServerException e) {
        logger.error("Could not retrieve Solr results for query '" + query + "'", e);
    }

    // Now collect and update the source IDs to their actual sources

    return adjustSourceIds(results, taxonomyLanguage);
}

From source file:fr.paris.lutece.plugins.search.solr.business.SolrSearchEngine.java

License:Open Source License

/**
 * Return the result with facets. Does NOT support authentification yet.
 * @param strQuery the query/*w  w w  .j  a  v a2  s  . c om*/
 * @param facetQueries The selected facets
 * @param sortName The facet name to sort by
 * @param sortOrder "asc" or "desc"
 * @param nLimit Maximal number of results.
 * @return the result with facets
 */
public SolrFacetedResult getFacetedSearchResults(String strQuery, String[] facetQueries, String sortName,
        String sortOrder, int nLimit, int nCurrentPageIndex, int nItemsPerPage, Boolean bSpellCheck) {
    SolrFacetedResult facetedResult = new SolrFacetedResult();

    SolrClient solrServer = SolrServerService.getInstance().getSolrServer();
    List<SolrSearchResult> results = new ArrayList<SolrSearchResult>();
    Hashtable<Field, List<String>> myValuesList = new Hashtable<Field, List<String>>();

    if (solrServer != null) {
        SolrQuery query = new SolrQuery(strQuery);
        query.setHighlight(true);
        query.setHighlightSimplePre(SOLR_HIGHLIGHT_PRE);
        query.setHighlightSimplePost(SOLR_HIGHLIGHT_POST);
        query.setHighlightSnippets(SOLR_HIGHLIGHT_SNIPPETS);
        query.setHighlightFragsize(SOLR_HIGHLIGHT_FRAGSIZE);
        query.setFacet(true);
        query.setFacetLimit(SOLR_FACET_LIMIT);
        //            query.setFacetMinCount( 1 );

        for (Field field : SolrFieldManager.getFacetList().values()) {
            //Add facet Field
            if (field.getEnableFacet()) {
                if (field.getName().equalsIgnoreCase("date")
                        || field.getName().toLowerCase().endsWith("_date")) {
                    query.setParam("facet.date", field.getName());
                    query.setParam("facet.date.start", SOLR_FACET_DATE_START);
                    query.setParam("facet.date.gap", SOLR_FACET_DATE_GAP);
                    query.setParam("facet.date.end", SOLR_FACET_DATE_END);
                    query.setParam("facet.date.mincount", "0");
                } else {
                    query.addFacetField(field.getSolrName());
                    query.setParam("f." + field.getSolrName() + ".facet.mincount",
                            String.valueOf(field.getFacetMincount()));
                }
                myValuesList.put(field, new ArrayList<String>());
            }
        }

        //Facet intersection
        List<String> treeParam = new ArrayList<String>();

        for (FacetIntersection intersect : SolrFieldManager.getIntersectionlist()) {
            treeParam.add(intersect.getField1().getSolrName() + "," + intersect.getField2().getSolrName());
        }

        //(String []) al.toArray (new String [0]);
        query.setParam("facet.tree", (String[]) treeParam.toArray(new String[0]));
        query.setParam("spellcheck", bSpellCheck);

        //sort order
        if ((sortName != null) && !"".equals(sortName)) {
            if (sortOrder.equals("asc")) {
                query.setSort(sortName, ORDER.asc);
            } else {
                query.setSort(sortName, ORDER.desc);
            }
        } else {
            for (Field field : SolrFieldManager.getSortList()) {
                if (field.getDefaultSort()) {
                    query.setSort(field.getName(), ORDER.desc);
                }
            }
        }

        //Treat HttpRequest
        //FacetQuery
        if (facetQueries != null) {
            for (String strFacetQuery : facetQueries) {
                //                    if ( strFacetQuery.contains( DATE_COLON ) )
                //                    {
                //                        query.addFilterQuery( strFacetQuery );
                //                    }
                //                    else
                //                    {
                String myValues[] = strFacetQuery.split(":", 2);
                if (myValues != null && myValues.length == 2) {
                    myValuesList = getFieldArrange(myValues, myValuesList);
                }
                //strFacetQueryWithColon = strFacetQuery.replaceFirst( SolrConstants.CONSTANT_COLON, COLON_QUOTE );
                //strFacetQueryWithColon += SolrConstants.CONSTANT_QUOTE;
                //                        query.addFilterQuery( strFacetQuery );
                //                    }
            }

            for (Field tmpFieldValue : myValuesList.keySet()) {
                List<String> strValues = myValuesList.get(tmpFieldValue);
                String strFacetString = "";
                if (strValues.size() > 0) {
                    strFacetString = extractQuery(strValues, tmpFieldValue.getOperator());
                    if (tmpFieldValue.getName().equalsIgnoreCase("date")
                            || tmpFieldValue.getName().toLowerCase().endsWith("_date")) {
                        strFacetString = strFacetString.replaceAll("\"", "");
                    }
                    query.addFilterQuery(tmpFieldValue.getName() + ":" + strFacetString);
                }
            }
        }

        try {

            // count query
            query.setRows(0);
            QueryResponse response = solrServer.query(query);

            int nResults = (int) response.getResults().getNumFound();
            facetedResult.setCount(nResults > nLimit ? nLimit : nResults);

            query.setStart((nCurrentPageIndex - 1) * nItemsPerPage);
            query.setRows(nItemsPerPage > nLimit ? nLimit : nItemsPerPage);

            query.setParam("defType", DEF_TYPE);
            String strWeightValue = generateQueryWeightValue();
            query.setParam("qf", strWeightValue);

            response = solrServer.query(query);

            //HighLight
            Map<String, Map<String, List<String>>> highlightsMap = response.getHighlighting();
            SolrHighlights highlights = null;

            if (highlightsMap != null) {
                highlights = new SolrHighlights(highlightsMap);
            }

            //resultList
            List<SolrItem> itemList = response.getBeans(SolrItem.class);
            results = SolrUtil.transformSolrItemsToSolrSearchResults(itemList, highlights);

            //set the spellcheckresult
            facetedResult.setSolrSpellCheckResponse(response.getSpellCheckResponse());

            //Date facet
            if ((response.getFacetDates() != null) && !response.getFacetDates().isEmpty()) {
                facetedResult.setFacetDateList(response.getFacetDates());
            }

            //FacetField
            facetedResult.setFacetFields(response.getFacetFields());

            //Facet intersection (facet tree)
            NamedList<Object> resp = (NamedList<Object>) response.getResponse().get("facet_counts");

            if (resp != null) {
                NamedList<NamedList<NamedList<Integer>>> trees = (NamedList<NamedList<NamedList<Integer>>>) resp
                        .get("trees");
                Map<String, ArrayList<FacetField>> treesResult = new HashMap<String, ArrayList<FacetField>>();

                if (trees != null) {
                    for (Entry<String, NamedList<NamedList<Integer>>> selectedFacet : trees) { //Selected Facet (ex : type,categorie )
                                                                                               //System.out.println(selectedFacet.getKey());

                        ArrayList<FacetField> facetFields = new ArrayList<FacetField>(
                                selectedFacet.getValue().size());

                        for (Entry<String, NamedList<Integer>> facetField : selectedFacet.getValue()) {
                            FacetField ff = new FacetField(facetField.getKey());

                            //System.out.println("\t" + facetField.getKey());
                            for (Entry<String, Integer> value : facetField.getValue()) { // Second Level
                                ff.add(value.getKey(), value.getValue());

                                //System.out.println("\t\t" + value.getKey() + " : " + value.getValue());
                            }

                            facetFields.add(ff);
                        }

                        treesResult.put(selectedFacet.getKey(), facetFields);
                    }
                }

                facetedResult.setFacetIntersection(treesResult);
            }
        } catch (SolrServerException e) {
            AppLogService.error(e.getMessage(), e);
        } catch (IOException e) {
            AppLogService.error(e.getMessage(), e);
        }
    } else {
        facetedResult.setFacetFields(new ArrayList<FacetField>());
    }

    facetedResult.setSolrSearchResults(results);

    return facetedResult;
}

From source file:io.vertigo.dynamo.plugins.search.solr.SolrStatement.java

License:Apache License

private static SolrQuery createSolrQuery(final SearchQuery searchQuery,
        final IndexFieldNameResolver indexFieldNameResolver, final FacetedQuery filtersQuery,
        final int rowsPerQuery) {
    final SolrQuery solrQuery = new SolrQuery();
    solrQuery.set(CommonParams.ROWS, rowsPerQuery);
    solrQuery.setFields(SolrDocumentCodec.URN, SolrDocumentCodec.FULL_RESULT);
    if (searchQuery.isSortActive()) {
        final DtField sortField = searchQuery.getIndexDefinition().getIndexDtDefinition()
                .getField(searchQuery.getSortField());
        final String indexSortFieldName = indexFieldNameResolver.obtainIndexFieldName(sortField);
        solrQuery.addSortField(indexSortFieldName, searchQuery.getSortAsc() ? ORDER.asc : ORDER.desc);
    }/*from   w  ww  . java2 s.  c o m*/
    //solrQuery.set(CommonParams.START, 0); //peut servir d'offset
    final StringBuilder query = new StringBuilder();
    if (searchQuery.isBoostMostRecent()) {
        appendBoostMostRecent(searchQuery, query);
    }
    query.append(translateToSolr(searchQuery.getListFilter(), indexFieldNameResolver));
    solrQuery.setQuery(query.toString());

    for (final ListFilter facetQuery : filtersQuery.getListFilters()) {
        solrQuery.addFilterQuery(translateToSolr(facetQuery, indexFieldNameResolver));
    }
    solrQuery.setHighlight(true);
    solrQuery.setParam("hl.fl", "*");
    solrQuery.setHighlightSnippets(3);
    solrQuery.setParam("hl.mergeContiguous", true);
    //Ci dessous : pour avoir les facettes avec un compteur de doc  0
    //Pour l'instant dsactiv car elles peuvent tre dduites des dfinitions de facettes sauf pour celles tires des mots du dictionnaires dont on ne maitrise pas la quantit
    //solrQuery.setParam("facet.missing", true);

    return solrQuery;
}

From source file:net.yacy.peers.Protocol.java

License:Open Source License

protected static int solrQuery(final SearchEvent event, final SolrQuery solrQuery, final int offset,
        final int count, final Seed target, final int partitions, final Blacklist blacklist) {

    if (event.query.getQueryGoal().getQueryString(false) == null
            || event.query.getQueryGoal().getQueryString(false).length() == 0) {
        return -1; // we cannot query solr only with word hashes, there is no clear text string
    }//w  w w.  j av  a2 s .  co m
    event.addExpectedRemoteReferences(count);
    if (partitions > 0)
        solrQuery.set("partitions", partitions);
    solrQuery.setStart(offset);
    solrQuery.setRows(count);

    // set highlighting query attributes
    if (event.query.contentdom == Classification.ContentDomain.TEXT
            || event.query.contentdom == Classification.ContentDomain.ALL) {
        solrQuery.setHighlight(true);
        solrQuery.setHighlightFragsize(SearchEvent.SNIPPET_MAX_LENGTH);
        //solrQuery.setHighlightRequireFieldMatch();
        solrQuery.setHighlightSimplePost("</b>");
        solrQuery.setHighlightSimplePre("<b>");
        solrQuery.setHighlightSnippets(5);
        for (CollectionSchema field : snippetFields)
            solrQuery.addHighlightField(field.getSolrFieldName());
    } else {
        solrQuery.setHighlight(false);
    }
    boolean localsearch = target == null || target.equals(event.peers.mySeed());
    Map<String, ReversibleScoreMap<String>> facets = new HashMap<String, ReversibleScoreMap<String>>(
            event.query.facetfields.size());
    Map<String, LinkedHashSet<String>> snippets = new HashMap<String, LinkedHashSet<String>>(); // this will be a list of urlhash-snippet entries
    final QueryResponse[] rsp = new QueryResponse[] { null };
    final SolrDocumentList[] docList = new SolrDocumentList[] { null };
    String ip = target.getIP();
    {// encapsulate expensive solr QueryResponse object
        if (localsearch && !Switchboard.getSwitchboard()
                .getConfigBool(SwitchboardConstants.DEBUG_SEARCH_REMOTE_SOLR_TESTLOCAL, false)) {
            // search the local index
            try {
                SolrConnector sc = event.getQuery().getSegment().fulltext().getDefaultConnector();
                if (!sc.isClosed()) {
                    rsp[0] = sc.getResponseByParams(solrQuery);
                    docList[0] = rsp[0].getResults();
                }
            } catch (final Throwable e) {
                Network.log.info("SEARCH failed (solr), localpeer (" + e.getMessage() + ")", e);
                return -1;
            }
        } else {
            try {
                final boolean myseed = target == event.peers.mySeed();
                if (!myseed && !target.getFlagSolrAvailable()) { // skip if peer.dna has flag that last try resulted in error
                    Network.log.info("SEARCH skip (solr), remote Solr interface not accessible, peer="
                            + target.getName());
                    return -1;
                }
                final String address = myseed ? "localhost:" + target.getPort() : target.getPublicAddress(ip);
                final int solrtimeout = Switchboard.getSwitchboard()
                        .getConfigInt(SwitchboardConstants.FEDERATED_SERVICE_SOLR_INDEXING_TIMEOUT, 6000);
                Thread remoteRequest = new Thread() {
                    @Override
                    public void run() {
                        this.setName("Protocol.solrQuery(" + solrQuery.getQuery() + " to " + target.hash + ")");
                        try {
                            RemoteInstance instance = new RemoteInstance("http://" + address, null, "solr",
                                    solrtimeout); // this is a 'patch configuration' which considers 'solr' as default collection
                            try {
                                SolrConnector solrConnector = new RemoteSolrConnector(instance,
                                        myseed ? true : target.getVersion() >= 1.63, "solr");
                                if (!solrConnector.isClosed())
                                    try {
                                        rsp[0] = solrConnector.getResponseByParams(solrQuery);
                                        docList[0] = rsp[0].getResults();
                                    } catch (Throwable e) {
                                    } finally {
                                        solrConnector.close();
                                    }
                            } catch (Throwable ee) {
                            } finally {
                                instance.close();
                            }
                        } catch (Throwable eee) {
                        }
                    }
                };
                remoteRequest.start();
                remoteRequest.join(solrtimeout); // just wait until timeout appears
                if (remoteRequest.isAlive()) {
                    try {
                        remoteRequest.interrupt();
                    } catch (Throwable e) {
                    }
                    Network.log.info("SEARCH failed (solr), remote Peer: " + target.getName() + "/"
                            + target.getPublicAddress(ip) + " does not answer (time-out)");
                    target.setFlagSolrAvailable(false || myseed);
                    return -1; // give up, leave remoteRequest abandoned.
                }
                // no need to close this here because that sends a commit to remote solr which is not wanted here
            } catch (final Throwable e) {
                Network.log.info("SEARCH failed (solr), remote Peer: " + target.getName() + "/"
                        + target.getPublicAddress(ip) + " (" + e.getMessage() + ")");
                target.setFlagSolrAvailable(false || localsearch);
                return -1;
            }
        }

        if (rsp[0] == null || docList[0] == null) {
            Network.log.info("SEARCH failed (solr), remote Peer: " + target.getName() + "/"
                    + target.getPublicAddress(ip) + " returned null");
            target.setFlagSolrAvailable(false || localsearch);
            return -1;
        }

        // evaluate facets
        for (String field : event.query.facetfields) {
            FacetField facet = rsp[0].getFacetField(field);
            ReversibleScoreMap<String> result = new ClusteredScoreMap<String>(UTF8.insensitiveUTF8Comparator);
            List<Count> values = facet == null ? null : facet.getValues();
            if (values == null)
                continue;
            for (Count ff : values) {
                int c = (int) ff.getCount();
                if (c == 0)
                    continue;
                if (ff.getName().length() == 0)
                    continue; // facet entry without text is not useful
                result.set(ff.getName(), c);
            }
            if (result.size() > 0)
                facets.put(field, result);
        }

        // evaluate snippets
        Map<String, Map<String, List<String>>> rawsnippets = rsp[0].getHighlighting(); // a map from the urlhash to a map with key=field and value = list of snippets
        if (rawsnippets != null) {
            nextsnippet: for (Map.Entry<String, Map<String, List<String>>> re : rawsnippets.entrySet()) {
                Map<String, List<String>> rs = re.getValue();
                for (CollectionSchema field : snippetFields) {
                    if (rs.containsKey(field.getSolrFieldName())) {
                        List<String> s = rs.get(field.getSolrFieldName());
                        if (s.size() > 0) {
                            LinkedHashSet<String> ls = new LinkedHashSet<String>();
                            ls.addAll(s);
                            snippets.put(re.getKey(), ls);
                            continue nextsnippet;
                        }
                    }
                }
                // no snippet found :( --we don't assign a value here by default; that can be done as an evaluation outside this method
            }
        }
        rsp[0] = null;
    }

    // evaluate result
    if (docList == null || docList[0].size() == 0) {
        Network.log.info("SEARCH (solr), returned 0 out of 0 documents from "
                + (target == null ? "shard" : ("peer " + target.hash + ":" + target.getName())) + " query = "
                + solrQuery.toString());
        return 0;
    }

    List<URIMetadataNode> container = new ArrayList<URIMetadataNode>();
    Network.log.info("SEARCH (solr), returned " + docList[0].size() + " out of " + docList[0].getNumFound()
            + " documents and " + facets.size() + " facets " + facets.keySet().toString() + " from "
            + (target == null ? "shard" : ("peer " + target.hash + ":" + target.getName())));
    int term = count;
    Collection<SolrInputDocument> docs;
    if (event.addResultsToLocalIndex) { // only needed to store remote results
        docs = new ArrayList<SolrInputDocument>(docList[0].size());
    } else
        docs = null;
    for (final SolrDocument doc : docList[0]) {
        if (term-- <= 0) {
            break; // do not process more that requested (in case that evil peers fill us up with rubbish)
        }
        // get one single search result
        if (doc == null) {
            continue;
        }
        URIMetadataNode urlEntry = new URIMetadataNode(doc);

        if (blacklist.isListed(BlacklistType.SEARCH, urlEntry.url())) {
            if (Network.log.isInfo()) {
                if (localsearch) {
                    Network.log.info("local search (solr): filtered blacklisted url " + urlEntry.url());
                } else {
                    Network.log.info("remote search (solr): filtered blacklisted url " + urlEntry.url()
                            + " from "
                            + (target == null ? "shard" : ("peer " + target.hash + ":" + target.getName())));
                }
            }
            continue; // block with blacklist
        }

        final String urlRejectReason = Switchboard.getSwitchboard().crawlStacker
                .urlInAcceptedDomain(urlEntry.url());
        if (urlRejectReason != null) {
            if (Network.log.isInfo()) {
                if (localsearch) {
                    Network.log.info("local search (solr): rejected url '" + urlEntry.url() + "' ("
                            + urlRejectReason + ")");
                } else {
                    Network.log.info("remote search (solr): rejected url '" + urlEntry.url() + "' ("
                            + urlRejectReason + ") from peer " + target.getName());
                }
            }
            continue; // reject url outside of our domain
        }

        // passed all checks, store url
        if (!localsearch) {

            // put the remote documents to the local index. We must convert the solr document to a solr input document:
            if (event.addResultsToLocalIndex) {
                final SolrInputDocument sid = event.query.getSegment().fulltext().getDefaultConfiguration()
                        .toSolrInputDocument(doc);

                // the input document stays untouched because it contains top-level cloned objects
                docs.add(sid);
                // will be stored to index, and is a full solr document, can be added to firstseen
                event.query.getSegment().setFirstSeenTime(urlEntry.hash(),
                        Math.min(urlEntry.moddate().getTime(), System.currentTimeMillis()));
            }

            // after this conversion we can remove the largest and not used field text_t and synonyms_sxt from the document
            // because that goes into a search cache and would take a lot of memory in the search cache
            //doc.removeFields(CollectionSchema.text_t.getSolrFieldName());
            doc.removeFields(CollectionSchema.synonyms_sxt.getSolrFieldName());

            ResultURLs.stack(ASCII.String(urlEntry.url().hash()), urlEntry.url().getHost(),
                    event.peers.mySeed().hash.getBytes(), UTF8.getBytes(target.hash), EventOrigin.QUERIES);
        }

        // add the url entry to the word indexes
        container.add(urlEntry);
    }
    final int dls = docList[0].size();
    final int numFound = (int) docList[0].getNumFound();
    docList[0].clear();
    docList[0] = null;
    if (localsearch) {
        event.addNodes(container, facets, snippets, true, "localpeer", numFound);
        event.addFinalize();
        event.addExpectedRemoteReferences(-count);
        Network.log.info(
                "local search (solr): localpeer sent " + container.size() + "/" + numFound + " references");
    } else {
        if (event.addResultsToLocalIndex) {
            for (SolrInputDocument doc : docs) {
                event.query.getSegment().putDocument(doc);
            }
            docs.clear();
            docs = null;
        }
        event.addNodes(container, facets, snippets, false, target.getName() + "/" + target.hash, numFound);
        event.addFinalize();
        event.addExpectedRemoteReferences(-count);
        Network.log.info("remote search (solr): peer " + target.getName() + " sent "
                + (container.size() == 0 ? 0 : container.size()) + "/" + numFound + " references");
    }
    return dls;
}

From source file:org.ala.dao.FulltextSearchDaoImplSolr.java

License:Open Source License

/**
 * Helper method to create SolrQuery object and add facet settings
 *
 * @return solrQuery the SolrQuery//w  ww .  j ava 2s . c  o  m
 */
protected SolrQuery initSolrQuery(String[] facets) {
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.setQueryType("standard");
    if (facets == null) {
        //use the default set
        solrQuery.setFacet(true);
        solrQuery.addFacetField("idxtype");
        solrQuery.addFacetField("australian_s");
        solrQuery.addFacetField("speciesGroup");
        solrQuery.addFacetField("speciesSubgroup");
        //solrQuery.addFacetField("kingdom");
        solrQuery.addFacetField("rank");
        //solrQuery.addFacetField("rankId");
        //solrQuery.addFacetField("pestStatus");
        //        solrQuery.addFacetField("conservationStatus");
        solrQuery.addFacetField("conservationStatusAUS");
        solrQuery.addFacetField("conservationStatusACT");
        solrQuery.addFacetField("conservationStatusNSW");
        solrQuery.addFacetField("conservationStatusNT");
        solrQuery.addFacetField("conservationStatusQLD");
        solrQuery.addFacetField("conservationStatusSA");
        solrQuery.addFacetField("conservationStatusTAS");
        solrQuery.addFacetField("conservationStatusVIC");
        solrQuery.addFacetField("conservationStatusWA");
        solrQuery.addFacetField("category_m_s");
        solrQuery.addFacetField("category_NSW_m_s");
        solrQuery.addFacetField("category_ACT_m_s");
        solrQuery.addFacetField("category_QLD_m_s");
        solrQuery.addFacetField("category_SA_m_s");
        solrQuery.addFacetField("category_NT_m_s");
        solrQuery.addFacetField("category_TAS_m_s");
        solrQuery.addFacetField("category_WA_m_s");
        solrQuery.addFacetField("category_VIC_m_s");
    } else {
        solrQuery.addFacetField(facets);
    }

    solrQuery.setFacetMinCount(1);
    solrQuery.setRows(10);
    solrQuery.setStart(0);

    //add highlights
    solrQuery.setHighlight(true);
    solrQuery.setHighlightFragsize(80);
    solrQuery.setHighlightSnippets(2);
    solrQuery.setHighlightSimplePre("<strong>");
    solrQuery.setHighlightSimplePost("</strong>");
    solrQuery.add("hl.usePhraseHighlighter", "true");
    solrQuery.addHighlightField("commonName");
    solrQuery.addHighlightField("scientificName");
    solrQuery.addHighlightField("pestStatus");
    solrQuery.addHighlightField("conservationStatus");
    solrQuery.addHighlightField("simpleText");
    solrQuery.addHighlightField("content");

    return solrQuery;
}