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) {