package com.senseidb.clue.commands; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import org.apache.lucene.index.IndexReader; import org.apache.lucene.search.Explanation; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import com.senseidb.clue.ClueContext; public class ExplainCommand extends ClueCommand { public ExplainCommand(ClueContext ctx) { super(ctx); } @Override public String getName() { return "explain"; } @Override public String help() { return "shows score explanation of a doc"; } @Override public void execute(String[] args, PrintStream out) throws Exception { if (args.length < 2) { out.println("usage: query docs"); return; } String docString = args[args.length - 1]; String[] docList = docString.split(","); List<Integer> docidList = new ArrayList<Integer>(); try { for (String s : docList) { docidList.add(Integer.parseInt(s)); } } catch(Exception e) { out.println("error in parsing docids: "+e.getMessage()); return; } StringBuilder buf = new StringBuilder(); for (int i=0; i<args.length-1;++i) { buf.append(args[i]).append(" "); } IndexReader r = ctx.getIndexReader(); IndexSearcher searcher = new IndexSearcher(r); Query q = null; String qstring = buf.toString(); try{ q = ctx.getQueryBuilder().build(qstring); } catch(Exception e){ out.println("cannot parse query: "+e.getMessage()); return; } for (Integer docid : docidList) { Explanation expl = searcher.explain(q, docid); out.println(expl); } out.flush(); } }