5

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 のみが含まれているようです。

正しい説明を得る方法はありますか?

4

3 に答える 3

6

私の場合、Solrインデックス自体にバグがありました。以下のコードが機能するようになりました。

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

インデックスを作成して上記のような問題が発生した場合は、schema.xml(例<uniqueKey>id</uniqueKey>)で決定されたidフィールドに正しいデータが含まれていることを確認してください。私の場合、コードで使用したidフィールドは、Solrが考えていたものと同じではなく、データが含まれていなかったため、explainmapにはキーがnullのフィールドが1つしかありませんでした。

于 2010-09-29T10:08:59.187 に答える
1

また、フィールド リストで特別な [explain] フィールド (角括弧付き) を渡すことで、Explain 情報をドキュメント内のフィールドとして取得することもできます。

于 2014-03-24T14:55:22.353 に答える
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>
于 2010-09-29T09:58:08.357 に答える