diff src/luan/modules/lucene/LuceneIndex.java @ 1771:c62324841dfb

improve NumberFieldParser and add key map lucene query
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 25 Jun 2023 15:05:09 -0600
parents 527c53b91a50
children
line wrap: on
line diff
--- a/src/luan/modules/lucene/LuceneIndex.java	Thu Jun 15 17:55:47 2023 -0600
+++ b/src/luan/modules/lucene/LuceneIndex.java	Sun Jun 25 15:05:09 2023 -0600
@@ -27,6 +27,9 @@
 import org.apache.lucene.util.NumericUtils;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.Sort;
 import org.apache.lucene.search.SortField;
@@ -198,12 +201,6 @@
 		}
 	}
 
-	private static Term term(String key,long value) {
-		BytesRef br = new BytesRef();
-		NumericUtils.longToPrefixCoded(value,0,br);
-		return new Term(key,br);
-	}
-
 	public void delete(String queryStr)
 		throws IOException, ParseException, LuanException
 	{
@@ -460,11 +457,24 @@
 		close(openSearcher());
 	}
 
-	public int advanced_search( final Luan luan, String queryStr, LuanFunction fn, Integer n, String sortStr )
+	public int advanced_search( final Luan luan, Object queryStr, LuanFunction fn, Integer n, String sortStr )
 		throws LuanException, IOException, ParseException
 	{
-		Utils.checkNotNull(queryStr);
-		Query query = GoodQueryParser.parseQuery(mfp,queryStr);
+		Query query;
+		if( queryStr instanceof String ) {
+			query = GoodQueryParser.parseQuery(mfp,(String)queryStr);
+		} else if( queryStr instanceof LuanTable ) {
+			LuanTable t = (LuanTable)queryStr;
+			BooleanQuery bq = new BooleanQuery();
+			for( Map.Entry<Object,Object> entry : t.rawIterable() ) {
+				String name = (String)entry.getKey();
+				Object value = entry.getValue();
+				Query q = new TermQuery( LuceneUtils.term(name,value) );
+				bq.add( q, BooleanClause.Occur.MUST );
+			}
+			query = bq;
+		} else
+			throw new LuanException("query must be string or table");
 		IndexSearcher searcher = threadLocalSearcher.get();
 		boolean inTransaction = searcher != null;
 		if( !inTransaction )