Mercurial Hosting > luan
diff lucene/src/luan/modules/lucene/LuceneSearcher.java @ 233:ef39bc4d3f70
basic lucene works
git-svn-id: https://luan-java.googlecode.com/svn/trunk@234 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Thu, 02 Oct 2014 02:58:55 +0000 |
parents | 9ce18106f95a |
children | b25feac318d8 |
line wrap: on
line diff
--- a/lucene/src/luan/modules/lucene/LuceneSearcher.java Wed Oct 01 06:55:14 2014 +0000 +++ b/lucene/src/luan/modules/lucene/LuceneSearcher.java Thu Oct 02 02:58:55 2014 +0000 @@ -25,23 +25,21 @@ public final class LuceneSearcher { + private final LuceneIndex index; private final IndexSearcher searcher; - LuceneSearcher(IndexReader reader) { + LuceneSearcher(LuceneIndex index,IndexReader reader) { + this.index = index; this.searcher = new IndexSearcher(reader); } // call in finally block - void close() { - try { - searcher.getIndexReader().decRef(); - } catch(IOException e) { - throw new RuntimeException(e); - } + void close() throws IOException { + searcher.getIndexReader().decRef(); } - public LuanTable doc(int docID) throws IOException { - return LuceneDocument.toTable(searcher.doc(docID)); + LuanTable doc(LuanState luan,int docID) throws LuanException, IOException { + return index.toTable(luan,searcher.doc(docID)); } TopDocs search(Query query,int n) throws IOException { @@ -54,46 +52,57 @@ // luan - private Query termQuery(Map<Object,Object> map) { + private Query termQuery(LuanTable queryTbl) { + if( queryTbl.length() != 0 ) + return null; + Map<Object,Object> map = queryTbl.asMap(); if( map.size() != 1 ) return null; Map.Entry<Object,Object> entry = map.entrySet().iterator().next(); Object key = entry.getKey(); Object value = entry.getValue(); if( key instanceof String && value instanceof String ) { - return new TermQuery(new Term( (String)key, (String)value )); + return new TermQuery(index.newTerm( (String)key, (String)value )); } return null; } - private Query booleanQuery(Map<Object,Object> map) { + private Query booleanQuery(LuanTable queryTbl) { + if( !queryTbl.isList() ) + return null; + List<Object> clauses = queryTbl.asList(); BooleanQuery query = new BooleanQuery(); - for( Map.Entry<Object,Object> entry : map.entrySet() ) { - Object key = entry.getKey(); - Object value = entry.getValue(); - if( !(key instanceof String && value instanceof LuanTable) ) + for( Object obj : clauses ) { + if( !(obj instanceof LuanTable) ) return null; - Query subQuery = query( (LuanTable)value ); - if( subQuery == null ) + LuanTable tbl = (LuanTable)obj; + if( !(tbl.isList() && tbl.length()==2) ) + return null; + List<Object> list = tbl.asList(); + Object obj0 = list.get(0); + Object obj1 = list.get(1); + if( !(obj0 instanceof String && obj1 instanceof LuanTable) ) return null; BooleanClause.Occur occur; try { - occur = BooleanClause.Occur.valueOf( ((String)key).toUpperCase() ); + occur = BooleanClause.Occur.valueOf( ((String)obj0).toUpperCase() ); } catch(IllegalArgumentException e) { return null; } + Query subQuery = query( (LuanTable)obj1 ); + if( subQuery == null ) + return null; query.add(subQuery,occur); } return query; } private Query query(LuanTable queryTbl) { - Map<Object,Object> map = queryTbl.asMap(); - if( map.isEmpty() ) + if( queryTbl.isEmpty() ) return null; Query query; - query = termQuery(map); if(query!=null) return query; - query = booleanQuery(map); if(query!=null) return query; + query = termQuery(queryTbl); if(query!=null) return query; + query = booleanQuery(queryTbl); if(query!=null) return query; return null; } @@ -106,6 +115,7 @@ if( !(obj0 instanceof String && obj1 instanceof String) ) throw luan.exception("invalid sort field"+pos); String field = (String)obj0; + field = index.fixFieldName(field); SortField.Type type; try { type = SortField.Type.valueOf( ((String)obj1).toUpperCase() ); @@ -115,10 +125,12 @@ if( size == 2 ) return new SortField(field,type); Object obj2 = list.get(2); - if( !(obj2 instanceof Boolean) ) - throw luan.exception("invalid sort field"+pos+", 'reverse' must be boolean"); - boolean reverse = (Boolean)obj2; - return new SortField(field,type,reverse); + if( !(obj2 instanceof String) ) + throw luan.exception("invalid sort field"+pos+", order must be 'ascending' or 'descending'"); + String order = (String)obj2; + if( !(order.equals("ascending") || order.equals("descending")) ) + throw luan.exception("invalid sort field"+pos+", order must be 'ascending' or 'descending'"); + return new SortField( field, type, order.equals("descending") ); } private Sort sort(LuanState luan,LuanTable sortTbl) throws LuanException { @@ -155,7 +167,7 @@ if( i >= scoreDocs.length ) return LuanFunction.NOTHING; try { - LuanTable doc = doc(scoreDocs[i++].doc); + LuanTable doc = doc(luan,scoreDocs[i++].doc); return doc; } catch(IOException e) { throw luan.exception(e);