Solrj客户端和XML响应

Solrj客户端和XML响应,solr,solrj,solrcloud,Solr,Solrj,Solrcloud,我正在jetty服务器中使用solr4.0。我想使用solrj查询solr,并期望结果以XML格式格式化。所以我使用了HttpSolrServer(CloudSolrServer和LBHttpSolrServer不支持设置解析器),并将解析器设置为Xmlparser。此外,我还设置了SolrQuery param wt=xml。但是我无法在xml中获得结果 package solrjtest; import java.io.File; import java.io.FileWriter; im

我正在jetty服务器中使用solr4.0。我想使用solrj查询solr,并期望结果以XML格式格式化。所以我使用了HttpSolrServer(CloudSolrServer和LBHttpSolrServer不支持设置解析器),并将解析器设置为Xmlparser。此外,我还设置了SolrQuery param 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();
        }
    }
}
package-solrjtest;
导入java.io.File;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.util.UUID;
导入org.apache.solr.client.solrj.SolrQuery;
导入org.apache.solr.client.solrj.SolrServerException;
导入org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
导入org.apache.solr.client.solrj.impl.XMLResponseParser;
导入org.apache.solr.client.solrj.response.QueryResponse;
导入org.apache.solr.common.SolrDocumentList;
类SolrjTest
{
公共静态void main(字符串[]args)引发IOException、SolrServerException
{
SolrjTest solrj=新的SolrjTest();
solrj.query(“你好”);
}
公共void查询(字符串q)抛出IOException、SolrServerException
{
CommonHttpSolrServer服务器=null;
字符串uuid=null;
布尔标志=真;
while(flag==true)
{
uuid=uuid.randomUUID().toString();
文件f=新文件(“D:/SearchResult/”+uuid+“.txt”);
如果(!f.exists())
{
flag=false;
f、 createNewFile();
}
}
尝试
{
服务器=新的CommonHttpSolrServer(“http://skyfall:8983/solr/documents");
setParser(新的XMLResponseParser());
}
捕获(例外e)
{
e、 printStackTrace();
}
SolrQuery query=新的SolrQuery();
setQuery(q);
setParam(“wt”、“xml”);
FileWriter fw=新的FileWriter(“D:/SearchResult/”+uuid+“.txt”);
尝试
{
QueryResponse qr=server.query(查询);
SolrDocumentList sdl=qr.getResults();
XMLResponseParser=新的XMLResponseParser();
Object[]o=新对象[sdl.size()];
o=sdl.toArray();
for(int i=0;i

知道这里出了什么问题吗?

通过这种设置,skyfall机器上的Solr服务器会以XML格式发送响应,CommonHttpSolrServer包装器会正确解析XML。但是,这并没有改变QueryResponse中的内部表示形式,它只是Solr类NamedList的一个薄包装

您可以(mis)使用XMLResponseWriter获取完整QueryResponse的XML表示形式:

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();
}

通过这种设置,skyfall机器上的Solr服务器将以XML形式发送响应,CommonHttpSolrServer包装器将正确解析XML。但是,这并没有改变QueryResponse中的内部表示形式,它只是Solr类NamedList的一个薄包装

您可以(mis)使用XMLResponseWriter获取完整QueryResponse的XML表示形式:

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();
}