2010-09-29 15 views
5

Przeszukuję indeks Solr za pomocą SolrJ i próbuję uzyskać wyjaśnienie Lucene dla zalogowania się do dalszego użytku.Jak uzyskać wyjaśnienie Lucene dla SolrDocument z Solrj?

Kod wygląda tak:

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

Pomyślałem, że response.getEplainMap() będzie zawierać mapę z wartością jak response.getEplainMap() get (id), ale wydaje się, że explainmap. zawiera tylko kluczowy null z wartością ostatniego znalezionego dokumentu.

Jakieś pomysły, jak uzyskać prawidłowe wyjaśnienie?

Odpowiedz

6

W moim przypadku wystąpił błąd w samym indeksie Solr. Kod poniżej działa teraz.

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

Tworząc indeks i problemy, takie jak powyżej, aby upewnić się, że pole ID określone schema.xml (np <uniqueKey>id</uniqueKey>) zawiera poprawnych danych. W moim przypadku pole identyfikacyjne, którego użyłem w kodzie, nie było takie, jak Solr myślał, że jest i nie zawierało żadnych danych, dlatego w mapie wyjaśniania było tylko jedno pole z kluczem zerowym.

1

Czy próbowałeś debugowania zapytania z konsoli administratora? To pokazuje pełny wynik.

QueryResponse ma kilka metod: getDebugMap() i getExplainMap(), które mogą okazać się przydatne. Nie przetestowałem tego w kodzie, ale w konsoli administracyjnej podczas debugowania zapytania otrzymuję:

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

Jak wspomniano w mojej własnej odpowiedzi, identyfikatory były błędne (czytaj: nieistniejące). Jednakże, gdybym przeczytał twoją odpowiedź, zanim sam odkryłbym problem, zobaczyłabym to z konsoli do debugowania, ponieważ uważam, że wynik wyjaśniania nie miał nazwy/id -attribute w ogóle jak w twoim poście . Więc w pewnym sensie, umieszczając informację, że rozwiązałeś mój problem :) – Timo

1

Możesz również uzyskać informacje wyjaśniające jako pole w dokumencie, przekazując w specjalnym polu [wyjaśnij] (w nawiasach kwadratowych) na liście pól.