Как получить объяснение Lucene для SolrDocument с Solrj? - PullRequest
5 голосов
/ 29 сентября 2010

Я ищу индекс Solr с помощью SolrJ и пытаюсь получить объяснение Lucene для регистрации его для дальнейшего использования.

Код выглядит так:

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

Я понялresponse.getEplainMap () будет содержать карту со значением, подобным response.getEplainMap (). get (id), но кажется, что карта объяснения содержит только нулевой ключ со значением последнего найденного документа.Есть идеи, как получить правильное объяснение?

Ответы [ 3 ]

6 голосов
/ 29 сентября 2010

В моем случае была ошибка в самом индексе Solr. Код ниже работает сейчас.

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

При создании индекса и возникновении проблем, подобных приведенным выше, убедитесь, что поле id, определенное в schema.xml (например, <uniqueKey>id</uniqueKey>), содержит правильные данные. В моем случае поле идентификатора, которое я использовал в коде, было не таким, как предполагал Солр, и не содержало данных, поэтому в файле объяснения было только одно поле с нулевым ключом.

1 голос
/ 24 марта 2014

Вы также можете получить информацию объяснения в виде поля в документе, передав специальное поле [объяснение] (в квадратных скобках) в списке полей.

1 голос
/ 29 сентября 2010

Вы пытались отладить запрос из консоли администратора?Это показывает полный вывод.

QueryResponse имеет несколько методов getDebugMap() и getExplainMap(), которые могут оказаться полезными.Я не тестировал его в коде, но на консоли администратора при отладке запроса я получаю следующее:

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