我正在使用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。
任何想法如何得到正确的解释?
答案 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]字段(带方括号),将解释信息作为文档中的字段获取。