Example usage for org.apache.solr.response SolrQueryResponse getResponseHeader

List of usage examples for org.apache.solr.response SolrQueryResponse getResponseHeader

Introduction

In this page you can find the example usage for org.apache.solr.response SolrQueryResponse getResponseHeader.

Prototype

public NamedList<Object> getResponseHeader() 

Source Link

Document

Response header to be logged

Usage

From source file:de.qaware.chronix.solr.query.ChronixQueryHandler.java

License:Apache License

@Override
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
    ModifiableSolrParams modifiableSolrParams = new ModifiableSolrParams(req.getParams());

    String originQuery = modifiableSolrParams.get(CommonParams.Q);

    long[] startAndEnd = dateRangeParser.getNumericQueryTerms(originQuery);
    long queryStart = or(startAndEnd[0], -1, 0);
    long queryEnd = or(startAndEnd[1], -1, Long.MAX_VALUE);

    modifiableSolrParams.set(ChronixQueryParams.QUERY_START_LONG, String.valueOf(queryStart));
    modifiableSolrParams.set(ChronixQueryParams.QUERY_END_LONG, String.valueOf(queryEnd));

    String query = dateRangeParser.replaceRangeQueryTerms(originQuery);

    modifiableSolrParams.set(CommonParams.Q, query);

    //Set the min required fields if the user define a sub set of fields
    modifiableSolrParams.set(CommonParams.FL, minRequiredFields(modifiableSolrParams.get(CommonParams.FL)));
    //Set the updated query
    req.setParams(modifiableSolrParams);

    //check the filter queries
    String[] filterQueries = modifiableSolrParams.getParams(CommonParams.FQ);

    //if we have an isAggregation
    if (contains(filterQueries, ChronixQueryParams.AGGREGATION_PARAM)
            || contains(filterQueries, ChronixQueryParams.ANALYSIS_PARAM)) {
        analysisHandler.handleRequestBody(req, rsp);

    } else {/*from w w  w.  j ava2 s  .com*/
        //let the default search handler do its work
        searchHandler.handleRequestBody(req, rsp);
    }

    //add the converted start and end to the response
    rsp.getResponseHeader().add(ChronixQueryParams.QUERY_START_LONG, queryStart);
    rsp.getResponseHeader().add(ChronixQueryParams.QUERY_END_LONG, queryEnd);
}

From source file:net.yacy.cora.federate.solr.responsewriter.EnhancedXMLResponseWriter.java

License:Open Source License

@Override
public void write(final Writer writer, final SolrQueryRequest request, final SolrQueryResponse rsp)
        throws IOException {
    writer.write(XML_START);/*from  www. j  av  a2 s  .  c  o  m*/
    NamedList<?> values = rsp.getValues();

    assert values.get("responseHeader") != null;
    assert values.get("response") != null;

    SimpleOrderedMap<Object> responseHeader = (SimpleOrderedMap<Object>) rsp.getResponseHeader();
    DocList response = ((ResultContext) values.get("response")).docs;
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> highlighting = (SimpleOrderedMap<Object>) values.get("highlighting");
    writeProps(writer, "responseHeader", responseHeader); // this.writeVal("responseHeader", responseHeader);
    writeDocs(writer, request, response); // this.writeVal("response", response);
    writeProps(writer, "highlighting", highlighting);
    writer.write(XML_STOP);
}

From source file:net.yacy.cora.federate.solr.responsewriter.GSAResponseWriter.java

License:Open Source License

@Override
public void write(final Writer writer, final SolrQueryRequest request, final SolrQueryResponse rsp)
        throws IOException {
    assert rsp.getValues().get("responseHeader") != null;
    assert rsp.getValues().get("response") != null;

    long start = System.currentTimeMillis();

    SimpleOrderedMap<Object> responseHeader = (SimpleOrderedMap<Object>) rsp.getResponseHeader();
    DocList response = ((ResultContext) rsp.getValues().get("response")).docs;
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> highlighting = (SimpleOrderedMap<Object>) rsp.getValues().get("highlighting");
    Map<String, LinkedHashSet<String>> snippets = OpensearchResponseWriter.highlighting(highlighting);
    Map<Object, Object> context = request.getContext();

    // parse response header
    ResHead resHead = new ResHead();
    NamedList<?> val0 = (NamedList<?>) responseHeader.get("params");
    resHead.rows = Integer.parseInt((String) val0.get(CommonParams.ROWS));
    resHead.offset = response.offset(); // equal to 'start'
    resHead.numFound = response.matches();
    //resHead.df = (String) val0.get("df");
    //resHead.q = (String) val0.get("q");
    //resHead.wt = (String) val0.get("wt");
    //resHead.status = (Integer) responseHeader.get("status");
    //resHead.QTime = (Integer) responseHeader.get("QTime");
    //resHead.maxScore = response.maxScore();

    // write header
    writer.write(XML_START);/*from  www  .  j av  a  2s.com*/
    String query = request.getParams().get("originalQuery");
    String site = getContextString(context, "site", "");
    String sort = getContextString(context, "sort", "");
    String client = getContextString(context, "client", "");
    String ip = getContextString(context, "ip", "");
    String access = getContextString(context, "access", "");
    String entqr = getContextString(context, "entqr", "");
    OpensearchResponseWriter.solitaireTag(writer, "TM", Long.toString(System.currentTimeMillis() - start));
    OpensearchResponseWriter.solitaireTag(writer, "Q", query);
    paramTag(writer, "sort", sort);
    paramTag(writer, "output", "xml_no_dtd");
    paramTag(writer, "ie", "UTF-8");
    paramTag(writer, "oe", "UTF-8");
    paramTag(writer, "client", client);
    paramTag(writer, "q", query);
    paramTag(writer, "site", site);
    paramTag(writer, "start", Integer.toString(resHead.offset));
    paramTag(writer, "num", Integer.toString(resHead.rows));
    paramTag(writer, "ip", ip);
    paramTag(writer, "access", access); // p - search only public content, s - search only secure content, a - search all content, both public and secure
    paramTag(writer, "entqr", entqr); // query expansion policy; (entqr=1) -- Uses only the search appliance's synonym file, (entqr=1) -- Uses only the search appliance's synonym file, (entqr=3) -- Uses both standard and local synonym files.

    // body introduction
    final int responseCount = response.size();
    writer.write("<RES SN=\"" + (resHead.offset + 1) + "\" EN=\"" + (resHead.offset + responseCount) + "\">");
    writer.write(lb); // The index (1-based) of the first and last search result returned in this result set.
    writer.write("<M>" + resHead.numFound + "</M>");
    writer.write(lb); // The estimated total number of results for the search.
    writer.write("<FI/>");
    writer.write(lb); // Indicates that document filtering was performed during this search.
    int nextStart = resHead.offset + responseCount;
    int nextNum = Math.min(resHead.numFound - nextStart, responseCount < resHead.rows ? 0 : resHead.rows);
    int prevStart = resHead.offset - resHead.rows;
    if (prevStart >= 0 || nextNum > 0) {
        writer.write("<NB>");
        if (prevStart >= 0) {
            writer.write("<PU>");
            XML.escapeCharData("/gsa/search?q=" + request.getParams().get(CommonParams.Q) + "&site=" + site
                    + "&lr=&ie=UTF-8&oe=UTF-8&output=xml_no_dtd&client=" + client + "&access=" + access
                    + "&sort=" + sort + "&start=" + prevStart + "&sa=N", writer); // a relative URL pointing to the NEXT results page.
            writer.write("</PU>");
        }
        if (nextNum > 0) {
            writer.write("<NU>");
            XML.escapeCharData("/gsa/search?q=" + request.getParams().get(CommonParams.Q) + "&site=" + site
                    + "&lr=&ie=UTF-8&oe=UTF-8&output=xml_no_dtd&client=" + client + "&access=" + access
                    + "&sort=" + sort + "&start=" + nextStart + "&num=" + nextNum + "&sa=N", writer); // a relative URL pointing to the NEXT results page.
            writer.write("</NU>");
        }
        writer.write("</NB>");
    }
    writer.write(lb);

    // parse body
    SolrIndexSearcher searcher = request.getSearcher();
    DocIterator iterator = response.iterator();
    String urlhash = null;
    for (int i = 0; i < responseCount; i++) {
        int id = iterator.nextDoc();
        Document doc = searcher.doc(id, SOLR_FIELDS);
        List<IndexableField> fields = doc.getFields();

        // pre-scan the fields to get the mime-type            
        String mime = "";
        for (IndexableField value : fields) {
            String fieldName = value.name();
            if (CollectionSchema.content_type.getSolrFieldName().equals(fieldName)) {
                mime = value.stringValue();
                break;
            }
        }

        // write the R header for a search result
        writer.write("<R N=\"" + (resHead.offset + i + 1) + "\"" + (i == 1 ? " L=\"2\"" : "")
                + (mime != null && mime.length() > 0 ? " MIME=\"" + mime + "\"" : "") + ">");
        writer.write(lb);
        //List<String> texts = new ArrayList<String>();
        List<String> descriptions = new ArrayList<String>();
        List<String> collections = new ArrayList<String>();
        int size = 0;
        boolean title_written = false; // the solr index may contain several; we take only the first which should be the visible tag in <title></title>
        String title = null;
        for (IndexableField value : fields) {
            String fieldName = value.name();

            // apply generic matching rule
            String stag = field2tag.get(fieldName);
            if (stag != null) {
                OpensearchResponseWriter.solitaireTag(writer, stag, value.stringValue());
                continue;
            }

            // if the rule is not generic, use the specific here
            if (CollectionSchema.id.getSolrFieldName().equals(fieldName)) {
                urlhash = value.stringValue();
                continue;
            }
            if (CollectionSchema.sku.getSolrFieldName().equals(fieldName)) {
                OpensearchResponseWriter.solitaireTag(writer, GSAToken.U.name(), value.stringValue());
                OpensearchResponseWriter.solitaireTag(writer, GSAToken.UE.name(), value.stringValue());
                continue;
            }
            if (CollectionSchema.title.getSolrFieldName().equals(fieldName) && !title_written) {
                title = value.stringValue();
                OpensearchResponseWriter.solitaireTag(writer, GSAToken.T.name(), highlight(title, query));
                //texts.add(value.stringValue());
                title_written = true;
                continue;
            }
            if (CollectionSchema.description_txt.getSolrFieldName().equals(fieldName)) {
                descriptions.add(value.stringValue());
                //texts.adds(description);
                continue;
            }
            if (CollectionSchema.last_modified.getSolrFieldName().equals(fieldName)) {
                Date d = new Date(Long.parseLong(value.stringValue()));
                writer.write("<FS NAME=\"date\" VALUE=\"" + HeaderFramework.formatGSAFS(d) + "\"/>\n");
                //OpensearchResponseWriter.solitaireTag(writer, GSAToken.CACHE_LAST_MODIFIED.getSolrFieldName(), HeaderFramework.formatRFC1123(d));
                //texts.add(value.stringValue());
                continue;
            }
            if (CollectionSchema.load_date_dt.getSolrFieldName().equals(fieldName)) {
                Date d = new Date(Long.parseLong(value.stringValue()));
                OpensearchResponseWriter.solitaireTag(writer, GSAToken.CRAWLDATE.name(),
                        HeaderFramework.formatRFC1123(d));
                //texts.add(value.stringValue());
                continue;
            }
            if (CollectionSchema.size_i.getSolrFieldName().equals(fieldName)) {
                size = value.stringValue() != null && value.stringValue().length() > 0
                        ? Integer.parseInt(value.stringValue())
                        : -1;
                continue;
            }
            if (CollectionSchema.collection_sxt.getSolrFieldName().equals(fieldName)) {
                collections.add(value.stringValue());
                continue;
            }
            //System.out.println("superfluous field: " + fieldName + ": " + value.stringValue()); // this can be avoided setting the enableLazyFieldLoading = false in solrconfig.xml
        }
        // compute snippet from texts
        LinkedHashSet<String> snippet = urlhash == null ? null : snippets.get(urlhash);
        OpensearchResponseWriter.removeSubsumedTitle(snippet, title);
        OpensearchResponseWriter.solitaireTag(writer, GSAToken.S.name(),
                snippet == null || snippet.size() == 0 ? (descriptions.size() > 0 ? descriptions.get(0) : "")
                        : OpensearchResponseWriter.getLargestSnippet(snippet));
        OpensearchResponseWriter.solitaireTag(writer, GSAToken.GD.name(),
                descriptions.size() > 0 ? descriptions.get(0) : "");
        String cols = collections.toString();
        if (collections.size() > 0)
            OpensearchResponseWriter.solitaireTag(writer, "COLS" /*SPECIAL!*/,
                    collections.size() > 1 ? cols.substring(1, cols.length() - 1).replaceAll(" ", "")
                            : collections.get(0));
        writer.write("<HAS><L/><C SZ=\"");
        writer.write(Integer.toString(size / 1024));
        writer.write("k\" CID=\"");
        writer.write(urlhash);
        writer.write("\" ENC=\"UTF-8\"/></HAS>\n");
        if (YaCyVer == null)
            YaCyVer = yacyVersion.thisVersion().getName() + "/"
                    + Switchboard.getSwitchboard().peers.mySeed().hash;
        OpensearchResponseWriter.solitaireTag(writer, GSAToken.ENT_SOURCE.name(), YaCyVer);
        OpensearchResponseWriter.closeTag(writer, "R");
    }
    writer.write("</RES>");
    writer.write(lb);
    writer.write(XML_STOP);
}

From source file:net.yacy.cora.federate.solr.responsewriter.OpensearchResponseWriter.java

License:Open Source License

@Override
public void write(final Writer writer, final SolrQueryRequest request, final SolrQueryResponse rsp)
        throws IOException {

    NamedList<?> values = rsp.getValues();

    assert values.get("responseHeader") != null;
    assert values.get("response") != null;

    SimpleOrderedMap<Object> responseHeader = (SimpleOrderedMap<Object>) rsp.getResponseHeader();
    DocList response = ((ResultContext) values.get("response")).docs;
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> facetCounts = (SimpleOrderedMap<Object>) values.get("facet_counts");
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> facetFields = facetCounts == null || facetCounts.size() == 0 ? null
            : (SimpleOrderedMap<Object>) facetCounts.get("facet_fields");
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> highlighting = (SimpleOrderedMap<Object>) values.get("highlighting");
    Map<String, LinkedHashSet<String>> snippets = highlighting(highlighting);

    // parse response header
    ResHead resHead = new ResHead();
    NamedList<?> val0 = (NamedList<?>) responseHeader.get("params");
    resHead.rows = Integer.parseInt((String) val0.get("rows"));
    resHead.offset = response.offset(); // equal to 'start'
    resHead.numFound = response.matches();
    //resHead.df = (String) val0.get("df");
    //resHead.q = (String) val0.get("q");
    //resHead.wt = (String) val0.get("wt");
    //resHead.status = (Integer) responseHeader.get("status");
    //resHead.QTime = (Integer) responseHeader.get("QTime");
    //resHead.maxScore = response.maxScore();

    // write header
    writer.write(("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            + "<?xml-stylesheet type='text/xsl' href='/yacysearch.xsl' version='1.0'?>\n"
            + "<rss version=\"2.0\"\n" + "    xmlns:yacy=\"http://www.yacy.net/\"\n"
            + "    xmlns:opensearch=\"http://a9.com/-/spec/opensearch/1.1/\"\n"
            + "    xmlns:media=\"http://search.yahoo.com/mrss/\"\n"
            + "    xmlns:atom=\"http://www.w3.org/2005/Atom\"\n"
            + "    xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"
            + "    xmlns:geo=\"http://www.w3.org/2003/01/geo/wgs84_pos#\"\n" + ">\n").toCharArray());
    openTag(writer, "channel");
    solitaireTag(writer, "opensearch:totalResults", Integer.toString(resHead.numFound));
    solitaireTag(writer, "opensearch:startIndex", Integer.toString(resHead.offset));
    solitaireTag(writer, "opensearch:itemsPerPage", Integer.toString(resHead.rows));
    solitaireTag(writer, RSSMessage.Token.title.name(), this.title);
    writer.write(/*from w  w  w .j  av a 2 s  .  c  o  m*/
            "<atom:link rel=\"search\" href=\"/opensearchdescription.xml\" type=\"application/opensearchdescription+xml\"/>");
    solitaireTag(writer, "description", "Search Result");
    //solitaireTag(writer, "link", "");
    //solitaireTag(writer, "image", "");

    // parse body
    final int responseCount = response.size();
    SolrIndexSearcher searcher = request.getSearcher();
    DocIterator iterator = response.iterator();
    String urlhash = null;
    for (int i = 0; i < responseCount; i++) {
        openTag(writer, "item");
        int id = iterator.nextDoc();
        Document doc = searcher.doc(id, SOLR_FIELDS);
        List<IndexableField> fields = doc.getFields();
        int fieldc = fields.size();
        List<String> texts = new ArrayList<String>();
        List<String> descriptions = new ArrayList<String>();
        String title = "";
        for (int j = 0; j < fieldc; j++) {
            IndexableField value = fields.get(j);
            String fieldName = value.name();

            // apply generic matching rule
            String stag = field2tag.get(fieldName);
            if (stag != null) {
                solitaireTag(writer, stag, value.stringValue());
                continue;
            }

            // take apart the url
            if (CollectionSchema.sku.getSolrFieldName().equals(fieldName)) {
                String u = value.stringValue();
                solitaireTag(writer, RSSMessage.Token.link.name(), u);
                try {
                    MultiProtocolURL url = new MultiProtocolURL(u);
                    solitaireTag(writer, YaCyMetadata.host.getURIref(), url.getHost());
                    solitaireTag(writer, YaCyMetadata.path.getURIref(), url.getPath());
                    solitaireTag(writer, YaCyMetadata.file.getURIref(), url.getFileName());
                } catch (final MalformedURLException e) {
                }
                continue;
            }

            // if the rule is not generic, use the specific here
            if (CollectionSchema.id.getSolrFieldName().equals(fieldName)) {
                urlhash = value.stringValue();
                solitaireTag(writer, RSSMessage.Token.guid.name(), urlhash, "isPermaLink=\"false\"");
                continue;
            }
            if (CollectionSchema.title.getSolrFieldName().equals(fieldName)) {
                title = value.stringValue();
                texts.add(title);
                continue;
            }
            if (CollectionSchema.last_modified.getSolrFieldName().equals(fieldName)) {
                Date d = new Date(Long.parseLong(value.stringValue()));
                solitaireTag(writer, RSSMessage.Token.pubDate.name(), HeaderFramework.formatRFC1123(d));
                continue;
            }
            if (CollectionSchema.description_txt.getSolrFieldName().equals(fieldName)) {
                String description = value.stringValue();
                descriptions.add(description);
                solitaireTag(writer, DublinCore.Description.getURIref(), description);
                texts.add(description);
                continue;
            }
            if (CollectionSchema.text_t.getSolrFieldName().equals(fieldName)) {
                texts.add(value.stringValue());
                continue;
            }
            if (CollectionSchema.size_i.getSolrFieldName().equals(fieldName)) {
                int size = value.numericValue().intValue();
                solitaireTag(writer, YaCyMetadata.size.getURIref(), Integer.toString(size));
                solitaireTag(writer, YaCyMetadata.sizename.getURIref(), RSSMessage.sizename(size));
                continue;
            }
            if (CollectionSchema.h1_txt.getSolrFieldName().equals(fieldName)
                    || CollectionSchema.h2_txt.getSolrFieldName().equals(fieldName)
                    || CollectionSchema.h3_txt.getSolrFieldName().equals(fieldName)
                    || CollectionSchema.h4_txt.getSolrFieldName().equals(fieldName)
                    || CollectionSchema.h5_txt.getSolrFieldName().equals(fieldName)
                    || CollectionSchema.h6_txt.getSolrFieldName().equals(fieldName)) {
                // because these are multi-valued fields, there can be several of each
                texts.add(value.stringValue());
                continue;
            }
        }

        // compute snippet from texts
        solitaireTag(writer, RSSMessage.Token.title.name(),
                title.length() == 0 ? (texts.size() == 0 ? "" : texts.get(0)) : title);
        LinkedHashSet<String> snippet = urlhash == null ? null : snippets.get(urlhash);
        String tagname = RSSMessage.Token.description.name();
        if (snippet == null || snippet.size() == 0) {
            writer.write("<");
            writer.write(tagname);
            writer.write('>');
            for (String d : descriptions) {
                XML.escapeCharData(d, writer);
            }
            writer.write("</");
            writer.write(tagname);
            writer.write(">\n");
        } else {
            removeSubsumedTitle(snippet, title);
            solitaireTag(writer, tagname, getLargestSnippet(snippet)); // snippet may be size=0
        }

        solitaireTag(writer, DublinCore.Subject.getURIref(),
                doc.get(CollectionSchema.keywords.getSolrFieldName()));

        closeTag(writer, "item");
    }

    openTag(writer, "yacy:navigation");

    // the facets can be created with the options &facet=true&facet.mincount=1&facet.field=host_s&facet.field=url_file_ext_s&facet.field=url_protocol_s&facet.field=author_sxt
    @SuppressWarnings("unchecked")
    NamedList<Integer> domains = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.host_s.getSolrFieldName());
    @SuppressWarnings("unchecked")
    NamedList<Integer> filetypes = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.url_file_ext_s.getSolrFieldName());
    @SuppressWarnings("unchecked")
    NamedList<Integer> protocols = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.url_protocol_s.getSolrFieldName());
    @SuppressWarnings("unchecked")
    NamedList<Integer> authors = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.author_sxt.getSolrFieldName());
    @SuppressWarnings("unchecked")
    NamedList<Integer> collections = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.collection_sxt.getSolrFieldName());

    if (domains != null) {
        openTag(writer,
                "yacy:facet name=\"domains\" displayname=\"Domains\" type=\"String\" min=\"0\" max=\"0\" mean=\"0\"");
        for (Map.Entry<String, Integer> entry : domains)
            facetEntry(writer, "site", entry.getKey(), Integer.toString(entry.getValue()));
        closeTag(writer, "yacy:facet");
    }
    if (filetypes != null) {
        openTag(writer,
                "yacy:facet name=\"filetypes\" displayname=\"Filetypes\" type=\"String\" min=\"0\" max=\"0\" mean=\"0\"");
        for (Map.Entry<String, Integer> entry : filetypes)
            facetEntry(writer, "filetype", entry.getKey(), Integer.toString(entry.getValue()));
        closeTag(writer, "yacy:facet");
    }
    if (protocols != null) {
        openTag(writer,
                "yacy:facet name=\"protocols\" displayname=\"Protocols\" type=\"String\" min=\"0\" max=\"0\" mean=\"0\"");
        for (Map.Entry<String, Integer> entry : protocols)
            facetEntry(writer, "protocol", entry.getKey(), Integer.toString(entry.getValue()));
        closeTag(writer, "yacy:facet");
    }
    if (authors != null) {
        openTag(writer,
                "yacy:facet name=\"authors\" displayname=\"Authors\" type=\"String\" min=\"0\" max=\"0\" mean=\"0\"");
        for (Map.Entry<String, Integer> entry : authors)
            facetEntry(writer, "author", entry.getKey(), Integer.toString(entry.getValue()));
        closeTag(writer, "yacy:facet");
    }
    if (collections != null) {
        openTag(writer,
                "yacy:facet name=\"collections\" displayname=\"Collections\" type=\"String\" min=\"0\" max=\"0\" mean=\"0\"");
        for (Map.Entry<String, Integer> entry : collections)
            facetEntry(writer, "collection", entry.getKey(), Integer.toString(entry.getValue()));
        closeTag(writer, "yacy:facet");
    }
    closeTag(writer, "yacy:navigation");

    closeTag(writer, "channel");
    writer.write("</rss>\n".toCharArray());
}

From source file:net.yacy.cora.federate.solr.responsewriter.YJsonResponseWriter.java

License:Open Source License

@Override
public void write(final Writer writer, final SolrQueryRequest request, final SolrQueryResponse rsp)
        throws IOException {

    NamedList<?> values = rsp.getValues();

    assert values.get("responseHeader") != null;
    assert values.get("response") != null;

    SimpleOrderedMap<Object> responseHeader = (SimpleOrderedMap<Object>) rsp.getResponseHeader();
    DocList response = ((ResultContext) values.get("response")).docs;
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> facetCounts = (SimpleOrderedMap<Object>) values.get("facet_counts");
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> facetFields = facetCounts == null || facetCounts.size() == 0 ? null
            : (SimpleOrderedMap<Object>) facetCounts.get("facet_fields");
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> highlighting = (SimpleOrderedMap<Object>) values.get("highlighting");
    Map<String, LinkedHashSet<String>> snippets = OpensearchResponseWriter.highlighting(highlighting);

    // parse response header
    ResHead resHead = new ResHead();
    NamedList<?> val0 = (NamedList<?>) responseHeader.get("params");
    resHead.rows = Integer.parseInt((String) val0.get("rows"));
    resHead.offset = response.offset(); // equal to 'start'
    resHead.numFound = response.matches();

    String jsonp = request.getParams().get("callback"); // check for JSONP
    if (jsonp != null) {
        writer.write(jsonp.toCharArray());
        writer.write("([".toCharArray());
    }//  w  ww .  j  a  v  a  2  s  .c  om

    // write header
    writer.write(("{\"channels\": [{\n").toCharArray());
    solitaireTag(writer, "totalResults", Integer.toString(resHead.numFound));
    solitaireTag(writer, "startIndex", Integer.toString(resHead.offset));
    solitaireTag(writer, "itemsPerPage", Integer.toString(resHead.rows));
    solitaireTag(writer, "title", this.title);
    solitaireTag(writer, "description", "Search Result");
    writer.write("\"items\": [\n".toCharArray());

    // parse body
    final int responseCount = response.size();
    SolrIndexSearcher searcher = request.getSearcher();
    DocIterator iterator = response.iterator();
    for (int i = 0; i < responseCount; i++) {
        try {
            writer.write("{\n".toCharArray());
            int id = iterator.nextDoc();
            Document doc = searcher.doc(id, OpensearchResponseWriter.SOLR_FIELDS);
            List<IndexableField> fields = doc.getFields();
            int fieldc = fields.size();
            List<String> texts = new ArrayList<String>();
            MultiProtocolURL url = null;
            String urlhash = null;
            List<String> descriptions = new ArrayList<String>();
            String title = "";
            StringBuilder path = new StringBuilder(80);
            for (int j = 0; j < fieldc; j++) {
                IndexableField value = fields.get(j);
                String fieldName = value.name();

                // apply generic matching rule
                String stag = field2tag.get(fieldName);
                if (stag != null) {
                    solitaireTag(writer, stag, value.stringValue());
                    continue;
                }
                // some special handling here
                if (CollectionSchema.sku.getSolrFieldName().equals(fieldName)) {
                    String u = value.stringValue();
                    try {
                        url = new MultiProtocolURL(u);
                        String filename = url.getFileName();
                        solitaireTag(writer, "link", u);
                        solitaireTag(writer, "file", filename);
                        // get image license
                        if (MultiProtocolURL.isImage(MultiProtocolURL.getFileExtension(filename)))
                            URLLicense.aquireLicense(urlhash, url.toNormalform(true));
                    } catch (final MalformedURLException e) {
                    }
                    continue;
                }
                if (CollectionSchema.title.getSolrFieldName().equals(fieldName)) {
                    title = value.stringValue();
                    texts.add(title);
                    continue;
                }
                if (CollectionSchema.description_txt.getSolrFieldName().equals(fieldName)) {
                    String description = value.stringValue();
                    descriptions.add(description);
                    texts.add(description);
                    continue;
                }
                if (CollectionSchema.id.getSolrFieldName().equals(fieldName)) {
                    urlhash = value.stringValue();
                    solitaireTag(writer, "guid", urlhash);
                    continue;
                }
                if (CollectionSchema.url_paths_sxt.getSolrFieldName().equals(fieldName)) {
                    path.append('/').append(value.stringValue());
                    continue;
                }
                if (CollectionSchema.last_modified.getSolrFieldName().equals(fieldName)) {
                    Date d = new Date(Long.parseLong(value.stringValue()));
                    solitaireTag(writer, "pubDate", HeaderFramework.formatRFC1123(d));
                    continue;
                }
                if (CollectionSchema.size_i.getSolrFieldName().equals(fieldName)) {
                    int size = value.stringValue() != null && value.stringValue().length() > 0
                            ? Integer.parseInt(value.stringValue())
                            : -1;
                    int sizekb = size / 1024;
                    int sizemb = sizekb / 1024;
                    solitaireTag(writer, "size", value.stringValue());
                    solitaireTag(writer, "sizename",
                            sizemb > 0 ? (Integer.toString(sizemb) + " mbyte")
                                    : sizekb > 0 ? (Integer.toString(sizekb) + " kbyte")
                                            : (Integer.toString(size) + " byte"));
                    continue;
                }
                if (CollectionSchema.text_t.getSolrFieldName().equals(fieldName)) {
                    texts.add(value.stringValue());
                    continue;
                }
                if (CollectionSchema.h1_txt.getSolrFieldName().equals(fieldName)
                        || CollectionSchema.h2_txt.getSolrFieldName().equals(fieldName)
                        || CollectionSchema.h3_txt.getSolrFieldName().equals(fieldName)
                        || CollectionSchema.h4_txt.getSolrFieldName().equals(fieldName)
                        || CollectionSchema.h5_txt.getSolrFieldName().equals(fieldName)
                        || CollectionSchema.h6_txt.getSolrFieldName().equals(fieldName)) {
                    // because these are multi-valued fields, there can be several of each
                    texts.add(value.stringValue());
                    continue;
                }

                //missing: "code","faviconCode"
            }

            // compute snippet from texts            
            solitaireTag(writer, "path", path.toString());
            solitaireTag(writer, "title",
                    title.length() == 0 ? (texts.size() == 0 ? path.toString() : texts.get(0)) : title);
            LinkedHashSet<String> snippet = urlhash == null ? null : snippets.get(urlhash);
            OpensearchResponseWriter.removeSubsumedTitle(snippet, title);
            writer.write("\"description\":\"");
            writer.write(serverObjects.toJSON(snippet == null || snippet.size() == 0
                    ? (descriptions.size() > 0 ? descriptions.get(0) : "")
                    : OpensearchResponseWriter.getLargestSnippet(snippet)));
            writer.write("\"\n}\n");
            if (i < responseCount - 1) {
                writer.write(",\n".toCharArray());
            }
        } catch (final Throwable ee) {
        }
    }
    writer.write("],\n".toCharArray());

    writer.write("\"navigation\":[\n");

    // the facets can be created with the options &facet=true&facet.mincount=1&facet.field=host_s&facet.field=url_file_ext_s&facet.field=url_protocol_s&facet.field=author_sxt
    @SuppressWarnings("unchecked")
    NamedList<Integer> domains = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.host_s.getSolrFieldName());
    @SuppressWarnings("unchecked")
    NamedList<Integer> filetypes = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.url_file_ext_s.getSolrFieldName());
    @SuppressWarnings("unchecked")
    NamedList<Integer> protocols = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.url_protocol_s.getSolrFieldName());
    @SuppressWarnings("unchecked")
    NamedList<Integer> authors = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.author_sxt.getSolrFieldName());
    @SuppressWarnings("unchecked")
    NamedList<Integer> collections = facetFields == null ? null
            : (NamedList<Integer>) facetFields.get(CollectionSchema.collection_sxt.getSolrFieldName());

    if (domains != null) {
        writer.write(
                "{\"facetname\":\"domains\",\"displayname\":\"Provider\",\"type\":\"String\",\"min\":\"0\",\"max\":\"0\",\"mean\":\"0\",\"elements\":[\n"
                        .toCharArray());
        for (int i = 0; i < domains.size(); i++) {
            facetEntry(writer, "site", domains.getName(i), Integer.toString(domains.getVal(i)));
            if (i < domains.size() - 1)
                writer.write(',');
            writer.write("\n");
        }
        writer.write("]},\n".toCharArray());
    }
    if (filetypes != null) {
        writer.write(
                "{\"facetname\":\"filetypes\",\"displayname\":\"Filetypes\",\"type\":\"String\",\"min\":\"0\",\"max\":\"0\",\"mean\":\"0\",\"elements\":[\n"
                        .toCharArray());
        List<Map.Entry<String, Integer>> l = new ArrayList<Map.Entry<String, Integer>>();
        for (Map.Entry<String, Integer> e : filetypes) {
            if (e.getKey().length() <= 6)
                l.add(e);
            if (l.size() >= 16)
                break;
        }
        for (int i = 0; i < l.size(); i++) {
            Map.Entry<String, Integer> e = l.get(i);
            facetEntry(writer, "filetype", e.getKey(), Integer.toString(e.getValue()));
            if (i < l.size() - 1)
                writer.write(',');
            writer.write("\n");
        }
        writer.write("]},\n".toCharArray());
    }
    if (protocols != null) {
        writer.write(
                "{\"facetname\":\"protocols\",\"displayname\":\"Protocol\",\"type\":\"String\",\"min\":\"0\",\"max\":\"0\",\"mean\":\"0\",\"elements\":[\n"
                        .toCharArray());
        for (int i = 0; i < protocols.size(); i++) {
            facetEntry(writer, "protocol", protocols.getName(i), Integer.toString(protocols.getVal(i)));
            if (i < protocols.size() - 1)
                writer.write(',');
            writer.write("\n");
        }
        writer.write("]},\n".toCharArray());
    }
    if (authors != null) {
        writer.write(
                "{\"facetname\":\"authors\",\"displayname\":\"Authors\",\"type\":\"String\",\"min\":\"0\",\"max\":\"0\",\"mean\":\"0\",\"elements\":[\n"
                        .toCharArray());
        for (int i = 0; i < authors.size(); i++) {
            facetEntry(writer, "author", authors.getName(i), Integer.toString(authors.getVal(i)));
            if (i < authors.size() - 1)
                writer.write(',');
            writer.write("\n");
        }
        writer.write("]},\n".toCharArray());
    }
    if (collections != null) {
        writer.write(
                "{\"facetname\":\"collections\",\"displayname\":\"Collections\",\"type\":\"String\",\"min\":\"0\",\"max\":\"0\",\"mean\":\"0\",\"elements\":[\n"
                        .toCharArray());
        for (int i = 0; i < collections.size(); i++) {
            facetEntry(writer, "collection", collections.getName(i), Integer.toString(collections.getVal(i)));
            if (i < collections.size() - 1)
                writer.write(',');
            writer.write("\n");
        }
        writer.write("]},\n".toCharArray());
    }
    writer.write("]}]}\n".toCharArray());

    if (jsonp != null) {
        writer.write("])".toCharArray());
    }
}

From source file:org.opencms.search.solr.CmsSolrIndex.java

License:Open Source License

/**
 * Executes a spell checking Solr query and returns the Solr query response.<p>
 *
 * @param res the servlet response/*from  ww w  .j  a v  a  2 s .c  o m*/
 * @param cms the CMS object
 * @param q the query
 *
 * @throws CmsSearchException if something goes wrong
 */
public void spellCheck(ServletResponse res, CmsObject cms, CmsSolrQuery q) throws CmsSearchException {

    SolrCore core = null;
    LocalSolrQueryRequest solrQueryRequest = null;
    try {
        q.setRequestHandler("/spell");

        QueryResponse queryResponse = m_solr.query(q);

        List<CmsSearchResource> resourceDocumentList = new ArrayList<CmsSearchResource>();
        SolrDocumentList solrDocumentList = new SolrDocumentList();
        if (m_postProcessor != null) {
            for (int i = 0; (i < queryResponse.getResults().size()); 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 = getResource(cms, searchDoc);
                        if (resource != null) {
                            // permission check performed successfully: the user has read permissions!
                            if (m_postProcessor != null) {
                                doc = m_postProcessor.process(cms, resource,
                                        (SolrInputDocument) searchDoc.getDocument());
                            }
                            resourceDocumentList.add(new CmsSearchResource(resource, searchDoc));
                            solrDocumentList.add(doc);
                        }
                    }
                } 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);
                }
            }
            queryResponse.getResponse().setVal(queryResponse.getResponse().indexOf(QUERY_RESPONSE_NAME, 0),
                    solrDocumentList);
        }

        // create and return the result
        core = m_solr instanceof EmbeddedSolrServer
                ? ((EmbeddedSolrServer) m_solr).getCoreContainer().getCore(getCoreName())
                : null;

        SolrQueryResponse solrQueryResponse = new SolrQueryResponse();
        solrQueryResponse.setAllValues(queryResponse.getResponse());

        // create and initialize the solr request
        solrQueryRequest = new LocalSolrQueryRequest(core, solrQueryResponse.getResponseHeader());
        // set the OpenCms Solr query as parameters to the request
        solrQueryRequest.setParams(q);

        writeResp(res, solrQueryRequest, solrQueryResponse);

    } catch (Exception e) {
        throw new CmsSearchException(
                Messages.get().container(Messages.LOG_SOLR_ERR_SEARCH_EXECUTION_FAILD_1, q), e);
    } finally {
        if (solrQueryRequest != null) {
            solrQueryRequest.close();
        }
        if (core != null) {
            core.close();
        }
    }
}