Клиент Solrj и ответ XML

Я использую solr4.0 на сервере Jetty. Я хочу запросить solr с помощью solrj и ожидать, что результаты будут отформатированы в XML. Поэтому я использовал HttpSolrServer (CloudSolrServer и LBHttpSolrServer не поддерживают настройку синтаксического анализатора) и установил синтаксический анализатор на Xmlparser. Кроме того, я также устанавливаю параметр SolrQuery wt = xml. Но я не могу получить результаты в XML. Вот мой тестовый код

package solrjtest;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.UUID;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;


class SolrjTest
{

    public static void main(String[] args) throws IOException, SolrServerException
    {
        SolrjTest solrj = new SolrjTest();
        solrj.query("hello");
    }

    public void query(String q) throws IOException, SolrServerException
    {
        CommonsHttpSolrServer server = null;
        String uuid = null;
        boolean flag = true;
        while (flag == true)
        {
            uuid = UUID.randomUUID().toString();
            File f = new File("D:/SearchResult/" + uuid + ".txt");
            if (!f.exists())
            {
               flag=false;
               f.createNewFile();
            }
        }
        try
        {
            server = new CommonsHttpSolrServer("http://skyfall:8983/solr/documents");
            server.setParser(new XMLResponseParser());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        SolrQuery query = new SolrQuery();
        query.setQuery(q);
        query.setParam("wt", "xml");
        FileWriter fw = new FileWriter("D:/SearchResult/" + uuid + ".txt");
        try
        {
            QueryResponse qr = server.query(query);
            SolrDocumentList sdl = qr.getResults();
            XMLResponseParser r = new XMLResponseParser();

            Object[] o = new Object[sdl.size()];
            o = sdl.toArray();
            for (int i = 0; i < o.length; i++)
            {
                System.out.println(o[i].toString());
                fw.write(o[i].toString() + "\n");
            }
            fw.flush();
            fw.close();
            System.out.println("finished");
        }
        catch (SolrServerException e)
        {
            e.printStackTrace();
        }
    }
}

Есть идеи, что здесь происходит не так?


person Community    schedule 16.04.2013    source источник


Ответы (1)


С такой настройкой сервер Solr на скайфолле компьютера отправляет ответ в формате XML, а оболочка CommonsHttpSolrServer правильно анализирует XML. Однако это не меняет внутреннего представления в QueryResponse, который является лишь тонкой оболочкой класса Solr NamedList.

Вы можете (неправильно) использовать XMLResponseWriter для получения XML-представления полного QueryResponse:

private String toXML(SolrParams request, QueryResponse response) {
    XMLResponseWriter xmlWriter = new XMLResponseWriter();
    Writer w = new StringWriter();
    SolrQueryResponse sResponse = new SolrQueryResponse();
    sResponse.setAllValues(response.getResponse());
    try {
        xmlWriter.write(w, new LocalSolrQueryRequest(null, request), sResponse);
    } catch (IOException e) {
        throw new RuntimeException("Unable to convert Solr response into XML", e);
    }
    return w.toString();
}
person Toke Eskildsen    schedule 17.04.2013