如何使用Solrj获取SolceDocument的Lucene解释?

时间:2010-09-29 08:57:56

标签: java solr lucene solrj

我正在使用SolrJ搜索Solr索引并尝试获取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)的映射,但似乎explainmap只包含带有最后找到的文档值的键null。

任何想法如何得到正确的解释?

3 个答案:

答案 0 :(得分:6)

就我而言,Solr索引本身存在一个错误。下面的代码现在有效。

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

创建索引并遇到上述问题时,请确保schema.xml中确定的id字段(例如<uniqueKey>id</uniqueKey>)包含正确的数据。在我的例子中,我在代码中使用的id字段与Solr认为的不同,并且它不包含任何数据,因此explainmap只有一个字段,其中键为null。

答案 1 :(得分:1)

您是否尝试过从管理控制台调试查询?这将显示完整输出。

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>

答案 2 :(得分:1)

您还可以通过在字段列表中传入特殊[explain]字段(带方括号),将解释信息作为文档中的字段获取。