Mercurial Hosting > luan
diff lucene/src/luan/modules/lucene/Lucene.luan @ 544:c5a93767cc5c
lucene overhaul, untested
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 12 Jun 2015 19:11:44 -0600 |
parents | 7170a0c414d5 |
children | ddcd4296107a |
line wrap: on
line diff
--- a/lucene/src/luan/modules/lucene/Lucene.luan Mon Jun 08 01:11:08 2015 -0400 +++ b/lucene/src/luan/modules/lucene/Lucene.luan Fri Jun 12 19:11:44 2015 -0600 @@ -1,39 +1,28 @@ java() local Luan = require "luan:Luan" -local pairs = Luan.pairs -local ipairs = Luan.ipairs -local type = Luan.type -local number_type = Luan.number_type local error = Luan.error -local Number = require "luan:Number" -local number_type = Number.number_type -local Table = require "luan:Table" -local unpack = Table.unpack local LuceneIndex = require "java:luan.modules.lucene.LuceneIndex" -local Term = require "java:org.apache.lucene.index.Term" -local TermQuery = require "java:org.apache.lucene.search.TermQuery" -local TermRangeQuery = require "java:org.apache.lucene.search.TermRangeQuery" -local NumericRangeQuery = require "java:org.apache.lucene.search.NumericRangeQuery" -local MatchAllDocsQuery = require "java:org.apache.lucene.search.MatchAllDocsQuery" -local BooleanQuery = require "java:org.apache.lucene.search.BooleanQuery" -local BooleanClause = require "java:org.apache.lucene.search.BooleanClause" -local BytesRef = require "java:org.apache.lucene.util.BytesRef" -local NumericUtils = require "java:org.apache.lucene.util.NumericUtils" -local Sort = require "java:org.apache.lucene.search.Sort" -local SortField = require "java:org.apache.lucene.search.SortField" +local NumberFieldParser = require "java:sane.lucene.queryparser.NumberFieldParser" + local M = {} +M.type = { + string = LuceneIndex.STRING_FIELD_PARSER; + integer = NumberFieldParser.INT; + long = NumberFieldParser.LONG; + double = NumberFieldParser.DOUBLE; +} + function M.index(indexDir) local index = {} local java_index = LuceneIndex.new(indexDir) - index.fields = java_index.fields.newTable() + index.indexed_fields = java_index.indexedFieldsMeta.newTable() index.to_string = java_index.to_string index.backup = java_index.backup index.Writer = java_index.Writer index.Searcher = java_index.Searcher index.delete_all = java_index.delete_all - index.map_field_name = java_index.map_field_name index.close = java_index.close function index.save_document(doc) @@ -70,120 +59,6 @@ end ) end - - - local queryTbl = {} - index.query = queryTbl - - queryTbl.parse = java_index.parse - - queryTbl.all_docs = MatchAllDocsQuery.new() - - function queryTbl.term(field,value) - if value==nil and type(field)=="table" then - local iter = pairs(field) - field, value = iter() - iter()==nil or error "only one term allowed" - end - field and value or error "missing term" - field = index.map_field_name(field) - local tp = type(value) - if tp == "string" then - return TermQuery.new(Term.new(field,value)) - end - if tp == "number" then - local br = BytesRef.new() - tp = number_type(value) - if tp == "integer" then - NumericUtils.intToPrefixCoded(value,0,br) - elseif tp == "long" then - NumericUtils.longToPrefixCoded(value,0,br) - elseif tp == "double" then - value = NumericUtils.doubleToSortableLong(value) - NumericUtils.longToPrefixCoded(value,0,br) - else - error("invalid term value type: "..tp) - end - return TermQuery.new(Term.new(field,br)) - end - error("invalid term value type: "..tp) - end - - function queryTbl.range(field,min,max,include_min,include_max) - if include_min == nil then include_min = true end - if include_max == nil then include_max = true end - field = index.map_field_name(field) - local tp = type(min) - tp == type(max) or error "min and max types don't match" - if tp == "string" then - return TermRangeQuery.newStringRange(field,min,max,include_min,include_max) - end - if tp == "number" then - tp = number_type(min) - tp == number_type(max) or error "min and max number types don't match" - if tp == "integer" then - return NumericRangeQuery.newIntRange(field,min,max,include_min,include_max) - end - if tp == "long" then - return NumericRangeQuery.newLongRange(field,min,max,include_min,include_max) - end - if tp == "double" then - return NumericRangeQuery.newDoubleRange(field,min,max,include_min,include_max) - end - error("invalid term value type: "..tp) - end - error("invalid term value type: "..tp) - end - - function queryTbl.boolean(t) - local boolean_query = BooleanQuery.new() - for query, occur_string in pairs(t) do - local occur = BooleanClause.Occur.valueOf( occur_string.upper() ) - boolean_query.add( query, occur ) - end - return boolean_query - end - - -- and list - function queryTbl.all(t) - local bt = {} - for key, query in pairs(t) do - if type(key)=="string" then - query = queryTbl.term{[key]=query} - end - bt[query] = "MUST" - end - return queryTbl.boolean(bt) - end - - -- or list - function queryTbl.any(t) - local bt = {} - for key, query in pairs(t) do - if type(key)=="string" then - query = queryTbl.term{[key]=query} - end - bt[query] = "SHOULD" - end - return queryTbl.boolean(bt) - end - - - function queryTbl.sort(fields) - #fields > 0 or error "list of sort fields expected" - local a = {} - for _, f in ipairs(fields) do - f.field or error "missing sort field" - f.type or error "missing sort type" - local field = index.map_field_name(f.field) - local type = SortField.Type.valueOf( f.type.upper() ) - local reverse = f.reverse or false - a[#a+1] = SortField.new(field,type,reverse) - end - return Sort.new(unpack(a)) - end - - return index end