2010-09-29 5 views
5

Je cherche un index Solr avec SolrJ et essayer d'obtenir l'explication Lucene pour qu'il se connecter pour une utilisation ultérieure.Comment obtenir l'explication de Lucene pour un SolrDocument avec Solrj?

Le code va comme ceci:

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

Je pensais que response.getEplainMap() contiendrait une carte avec la valeur comme response.getEplainMap() get (id), mais il semble que le explainmap. contient uniquement la clé null avec la valeur du dernier document trouvé.

Toute idée comment obtenir l'explication correcte?

Répondre

6

Dans mon cas, il y avait un bug dans l'index Solr lui-même. Le code ci-dessous fonctionne maintenant.

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

Lors de la création d'un index et d'avoir des problèmes comme ci-dessus font en sorte que le champ id déterminé schema.xml (par exemple <uniqueKey>id</uniqueKey>) contient des données correctes. Dans mon cas, le champ id que j'ai utilisé dans le code n'était pas le même que Solr pensait qu'il était et il ne contenait aucune donnée, ainsi la explainmap n'avait qu'un seul champ avec une clé nulle.

1

Avez-vous essayé le débogage d'une requête à partir de la console d'administration? Cela vous montre la sortie complète.

QueryResponse a quelques méthodes getDebugMap() et getExplainMap() qui pourraient s'avérer utiles. Je ne l'ai pas testé dans le code mais sur la console d'administration lorsque je débogue une requête je reçois ce qui suit;

<?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

Comme mentionné dans ma réponse les ids ont eu tort (lire: inexistante). Cependant, si j'avais lu votre réponse avant de comprendre le problème moi-même je l'aurais vu mon depuis la console de requête de débogage car je crois l'expliquer la sortie n'a pas le nom/id -attribut du tout comme dans votre post . Donc, d'une certaine manière en postant que vous avez résolu mon problème aussi :) – Timo

1

Vous pouvez également obtenir l'expliquer information en tant que champ dans le document en passant dans le domaine particulier [expliquer] (avec des crochets) dans la liste des champs.

Questions connexes