Mercurial Hosting > luan
diff src/luan/modules/lucene/LuceneIndex.java @ 1342:60599adc27b8
add lucene search options
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 20 Feb 2019 12:09:51 -0700 |
parents | a015a0b5c388 |
children | 7d9a1f8894b0 |
line wrap: on
line diff
--- a/src/luan/modules/lucene/LuceneIndex.java Tue Feb 19 08:14:40 2019 -0700 +++ b/src/luan/modules/lucene/LuceneIndex.java Wed Feb 20 12:09:51 2019 -0700 @@ -53,7 +53,7 @@ import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.Collector; import org.apache.lucene.search.Scorer; -import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.Explanation; import org.apache.lucene.search.highlight.Formatter; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.InvalidTokenOffsetsException; @@ -355,16 +355,24 @@ private static class DocFn extends LuanFunction { final IndexSearcher searcher; + final Query query; int docID; - DocFn(Luan luan,IndexSearcher searcher) { + DocFn(Luan luan,IndexSearcher searcher,Query query) { super(luan); this.searcher = searcher; + this.query = query; } @Override public Object call(Object[] args) throws LuanException { try { - return toTable(luan(),searcher.doc(docID)); + LuanTable doc = toTable(luan(),searcher.doc(docID)); + if( args.length > 0 && "explain".equals(args[0]) ) { + Explanation explanation = searcher.explain(query,docID); + return new Object[]{doc,explanation}; + } else { + return doc; + } } catch(IOException e) { throw new LuanException(e); } @@ -421,7 +429,7 @@ if( fn!=null && n==null ) { if( sortStr != null ) throw new LuanException("sort must be nil when n is nil"); - final DocFn docFn = new DocFn(luan,searcher); + final DocFn docFn = new DocFn(luan,searcher,query); MyCollector col = new MyCollector() { @Override public void collect(int doc) { try { @@ -447,10 +455,11 @@ Sort sort = sortStr==null ? null : SaneQueryParser.parseSort(mfp,sortStr); TopDocs td = sort==null ? searcher.search(query,n) : searcher.search(query,n,sort); final ScoreDoc[] scoreDocs = td.scoreDocs; - DocFn docFn = new DocFn(luan,searcher); + DocFn docFn = new DocFn(luan,searcher,query); for( int i=0; i<scoreDocs.length; i++ ) { - docFn.docID = scoreDocs[i].doc; - fn.call(i+1,docFn); + ScoreDoc scoreDoc = scoreDocs[i]; + docFn.docID = scoreDoc.doc; + fn.call(i+1,docFn,scoreDoc.score); } return td.totalHits; } finally { @@ -614,7 +623,9 @@ } }; - public LuanFunction highlighter(String queryStr,LuanFunction formatter,final Integer fragmentSize,String dotdotdot) throws ParseException { + public LuanFunction highlighter(String queryStr,final LuanFunction formatter,final Integer fragmentSize,String dotdotdot) + throws ParseException + { Query query = SaneQueryParser.parseQuery(mfp,queryStr); Formatter fmt = new Formatter() { public String highlightTerm(String originalText,TokenGroup tokenGroup) {