Mercurial Hosting > luan
comparison 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 |
comparison
equal
deleted
inserted
replaced
232:9ce18106f95a | 233:ef39bc4d3f70 |
---|---|
23 import luan.LuanJavaFunction; | 23 import luan.LuanJavaFunction; |
24 import luan.LuanException; | 24 import luan.LuanException; |
25 | 25 |
26 | 26 |
27 public final class LuceneSearcher { | 27 public final class LuceneSearcher { |
28 private final LuceneIndex index; | |
28 private final IndexSearcher searcher; | 29 private final IndexSearcher searcher; |
29 | 30 |
30 LuceneSearcher(IndexReader reader) { | 31 LuceneSearcher(LuceneIndex index,IndexReader reader) { |
32 this.index = index; | |
31 this.searcher = new IndexSearcher(reader); | 33 this.searcher = new IndexSearcher(reader); |
32 } | 34 } |
33 | 35 |
34 // call in finally block | 36 // call in finally block |
35 void close() { | 37 void close() throws IOException { |
36 try { | 38 searcher.getIndexReader().decRef(); |
37 searcher.getIndexReader().decRef(); | |
38 } catch(IOException e) { | |
39 throw new RuntimeException(e); | |
40 } | |
41 } | 39 } |
42 | 40 |
43 public LuanTable doc(int docID) throws IOException { | 41 LuanTable doc(LuanState luan,int docID) throws LuanException, IOException { |
44 return LuceneDocument.toTable(searcher.doc(docID)); | 42 return index.toTable(luan,searcher.doc(docID)); |
45 } | 43 } |
46 | 44 |
47 TopDocs search(Query query,int n) throws IOException { | 45 TopDocs search(Query query,int n) throws IOException { |
48 return searcher.search(query,n); | 46 return searcher.search(query,n); |
49 } | 47 } |
52 return searcher.search(query,n,sort); | 50 return searcher.search(query,n,sort); |
53 } | 51 } |
54 | 52 |
55 // luan | 53 // luan |
56 | 54 |
57 private Query termQuery(Map<Object,Object> map) { | 55 private Query termQuery(LuanTable queryTbl) { |
56 if( queryTbl.length() != 0 ) | |
57 return null; | |
58 Map<Object,Object> map = queryTbl.asMap(); | |
58 if( map.size() != 1 ) | 59 if( map.size() != 1 ) |
59 return null; | 60 return null; |
60 Map.Entry<Object,Object> entry = map.entrySet().iterator().next(); | 61 Map.Entry<Object,Object> entry = map.entrySet().iterator().next(); |
61 Object key = entry.getKey(); | 62 Object key = entry.getKey(); |
62 Object value = entry.getValue(); | 63 Object value = entry.getValue(); |
63 if( key instanceof String && value instanceof String ) { | 64 if( key instanceof String && value instanceof String ) { |
64 return new TermQuery(new Term( (String)key, (String)value )); | 65 return new TermQuery(index.newTerm( (String)key, (String)value )); |
65 } | 66 } |
66 return null; | 67 return null; |
67 } | 68 } |
68 | 69 |
69 private Query booleanQuery(Map<Object,Object> map) { | 70 private Query booleanQuery(LuanTable queryTbl) { |
71 if( !queryTbl.isList() ) | |
72 return null; | |
73 List<Object> clauses = queryTbl.asList(); | |
70 BooleanQuery query = new BooleanQuery(); | 74 BooleanQuery query = new BooleanQuery(); |
71 for( Map.Entry<Object,Object> entry : map.entrySet() ) { | 75 for( Object obj : clauses ) { |
72 Object key = entry.getKey(); | 76 if( !(obj instanceof LuanTable) ) |
73 Object value = entry.getValue(); | |
74 if( !(key instanceof String && value instanceof LuanTable) ) | |
75 return null; | 77 return null; |
76 Query subQuery = query( (LuanTable)value ); | 78 LuanTable tbl = (LuanTable)obj; |
77 if( subQuery == null ) | 79 if( !(tbl.isList() && tbl.length()==2) ) |
80 return null; | |
81 List<Object> list = tbl.asList(); | |
82 Object obj0 = list.get(0); | |
83 Object obj1 = list.get(1); | |
84 if( !(obj0 instanceof String && obj1 instanceof LuanTable) ) | |
78 return null; | 85 return null; |
79 BooleanClause.Occur occur; | 86 BooleanClause.Occur occur; |
80 try { | 87 try { |
81 occur = BooleanClause.Occur.valueOf( ((String)key).toUpperCase() ); | 88 occur = BooleanClause.Occur.valueOf( ((String)obj0).toUpperCase() ); |
82 } catch(IllegalArgumentException e) { | 89 } catch(IllegalArgumentException e) { |
83 return null; | 90 return null; |
84 } | 91 } |
92 Query subQuery = query( (LuanTable)obj1 ); | |
93 if( subQuery == null ) | |
94 return null; | |
85 query.add(subQuery,occur); | 95 query.add(subQuery,occur); |
86 } | 96 } |
87 return query; | 97 return query; |
88 } | 98 } |
89 | 99 |
90 private Query query(LuanTable queryTbl) { | 100 private Query query(LuanTable queryTbl) { |
91 Map<Object,Object> map = queryTbl.asMap(); | 101 if( queryTbl.isEmpty() ) |
92 if( map.isEmpty() ) | |
93 return null; | 102 return null; |
94 Query query; | 103 Query query; |
95 query = termQuery(map); if(query!=null) return query; | 104 query = termQuery(queryTbl); if(query!=null) return query; |
96 query = booleanQuery(map); if(query!=null) return query; | 105 query = booleanQuery(queryTbl); if(query!=null) return query; |
97 return null; | 106 return null; |
98 } | 107 } |
99 | 108 |
100 private SortField sortField(LuanState luan,List<Object> list,String pos) throws LuanException { | 109 private SortField sortField(LuanState luan,List<Object> list,String pos) throws LuanException { |
101 int size = list.size(); | 110 int size = list.size(); |
104 Object obj0 = list.get(0); | 113 Object obj0 = list.get(0); |
105 Object obj1 = list.get(1); | 114 Object obj1 = list.get(1); |
106 if( !(obj0 instanceof String && obj1 instanceof String) ) | 115 if( !(obj0 instanceof String && obj1 instanceof String) ) |
107 throw luan.exception("invalid sort field"+pos); | 116 throw luan.exception("invalid sort field"+pos); |
108 String field = (String)obj0; | 117 String field = (String)obj0; |
118 field = index.fixFieldName(field); | |
109 SortField.Type type; | 119 SortField.Type type; |
110 try { | 120 try { |
111 type = SortField.Type.valueOf( ((String)obj1).toUpperCase() ); | 121 type = SortField.Type.valueOf( ((String)obj1).toUpperCase() ); |
112 } catch(IllegalArgumentException e) { | 122 } catch(IllegalArgumentException e) { |
113 throw luan.exception("invalid sort field type"+pos); | 123 throw luan.exception("invalid sort field type"+pos); |
114 } | 124 } |
115 if( size == 2 ) | 125 if( size == 2 ) |
116 return new SortField(field,type); | 126 return new SortField(field,type); |
117 Object obj2 = list.get(2); | 127 Object obj2 = list.get(2); |
118 if( !(obj2 instanceof Boolean) ) | 128 if( !(obj2 instanceof String) ) |
119 throw luan.exception("invalid sort field"+pos+", 'reverse' must be boolean"); | 129 throw luan.exception("invalid sort field"+pos+", order must be 'ascending' or 'descending'"); |
120 boolean reverse = (Boolean)obj2; | 130 String order = (String)obj2; |
121 return new SortField(field,type,reverse); | 131 if( !(order.equals("ascending") || order.equals("descending")) ) |
132 throw luan.exception("invalid sort field"+pos+", order must be 'ascending' or 'descending'"); | |
133 return new SortField( field, type, order.equals("descending") ); | |
122 } | 134 } |
123 | 135 |
124 private Sort sort(LuanState luan,LuanTable sortTbl) throws LuanException { | 136 private Sort sort(LuanState luan,LuanTable sortTbl) throws LuanException { |
125 if( !sortTbl.isList() ) | 137 if( !sortTbl.isList() ) |
126 throw luan.exception("invalid sort, must be list"); | 138 throw luan.exception("invalid sort, must be list"); |
153 | 165 |
154 @Override public Object call(LuanState luan,Object[] args) throws LuanException { | 166 @Override public Object call(LuanState luan,Object[] args) throws LuanException { |
155 if( i >= scoreDocs.length ) | 167 if( i >= scoreDocs.length ) |
156 return LuanFunction.NOTHING; | 168 return LuanFunction.NOTHING; |
157 try { | 169 try { |
158 LuanTable doc = doc(scoreDocs[i++].doc); | 170 LuanTable doc = doc(luan,scoreDocs[i++].doc); |
159 return doc; | 171 return doc; |
160 } catch(IOException e) { | 172 } catch(IOException e) { |
161 throw luan.exception(e); | 173 throw luan.exception(e); |
162 } | 174 } |
163 } | 175 } |