2010-09-29 5 views
5

Estoy buscando un índice de Solr con SolrJ y tratando de obtener la explicación de Lucene para iniciar sesión para un uso posterior.¿Cómo obtener la explicación de Lucene para SolrDocument con Solrj?

El código dice así:

SolrServer server = new CommonsHttpSolrServer("solr_url"); 
    SolrQuery solrquery = new SolrQuery(); 
    solrquery.set("fl", "score, id"); // id is a String field 
    solrquery.set("rows", "1000"); 
    solrquery.set("debugQuery", "on"); 
    solrquery.setQuery("query words here"); 

    try { 
     QueryResponse response = server.query(solrquery); 
     SolrDocumentList docs = response.getResults(); 
     Iterator<SolrDocument> dociterator = docs.iterator(); 

     while (dociterator.hasNext()) 
     { 
      SolrDocument doc = dociterator.next(); 
      String id = (String) doc.getFirstValue(idfield); 
      Float relevance = (Float) doc.getFirstValue("score"); 
      String explanation = ???; 
     } 
    } catch (SolrServerException e) { 
     e.printStackTrace(); 
    } 

que pensé que response.getEplainMap() contendría un mapa con el valor como response.getEplainMap get() (id), pero parece que el explainmap. contiene solo la clave nula con el valor del último documento encontrado.

Alguna idea de cómo obtener la explicación correcta?

Respuesta

6

En mi caso, había un error en el índice Solr. El código a continuación funciona ahora.

Map<String, String> explainmap = response.getExplainMap(); 
String explanation = explainmap.get(id); 

Al crear un índice y que tiene problemas como por encima de asegurarse de que el campo id determinado en schema.xml (por ejemplo <uniqueKey>id</uniqueKey>) contiene datos correctos. En mi caso, el campo de identificación que utilicé en el código no era el mismo que solr pensó que era y no contenía datos, por lo que el mapa de explicación tenía solo un campo con una clave nula.

1

¿Ha intentado depurar una consulta desde la consola de administración? Esto te muestra la salida completa.

QueryResponse tiene un par de métodos getDebugMap() y getExplainMap() que pueden ser útiles. No lo he probado en el código, pero en la consola de administración cuando depuro una consulta obtengo lo siguiente;

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">0</int> 
    <lst name="params"> 
     <str name="q">stuff</str> 
     <str name="start">0</str> 
     <str name="indent">on</str> 
     <str name="explainOther"/> 
     <str name="wt">standard</str> 
     <str name="hl.fl"/> 
     <str name="fq"/> 
     <str name="version">2.2</str> 
     <str name="qt">standard</str> 
     <str name="debugQuery">on</str> 
     <str name="fl">*,score</str> 
     <str name="rows">1</str> 
    </lst> 
    </lst> 
    <result name="response" numFound="79" start="0" maxScore="4.050907"> 
    <doc> 
     <float name="score">4.050907</float> 
     ..other bits of data 
    </doc> 
    </result> 
    <lst name="debug"> 
    <str name="rawquerystring">stuff</str> 
    <str name="querystring">stuff</str> 
    <str name="parsedquery">MYSEARCHFIELD:stuff</str> 
    <str name="parsedquery_toString">MYSEARCHFIELD:stuff</str> 
    <lst name="explain"> 
     <str name="6095">  <--- 6095 is the ID of the document 
     4.050907 = (MATCH) fieldWeight(MYSEARCHFIELD:stuff in 1292), product of: 
     1.4142135 = tf(termFreq(MYSEARCHFIELD:stuff)=2) 
     9.166156 = idf(docFreq=79, maxDocs=281583) 
     0.3125 = fieldNorm(field=MYSEARCHFIELD, doc=1292) 
     </str> 
    </lst> 

    ..timing stuff here 

    </lst> 
</response> 
+0

Como mencioné en mi propia respuesta, los identificadores eran incorrectos (léase: inexistente). Sin embargo, si hubiera leído su respuesta antes de resolver el problema yo mismo, lo habría visto desde la consola de consultas de depuración, ya que creo que el resultado de la explicación no tenía el nombre/id-atributo en absoluto como en su publicación . Entonces, de alguna manera, al publicar, resolviste mi problema también :) – Timo

1

También puede obtener la información como un campo en el documento explica pasando en el campo especial [explique] (entre corchetes) en la lista de campos.

Cuestiones relacionadas