Mercurial Hosting > luan
view lucene/src/luan/modules/lucene/Lucene.luan @ 521:8a217fe5b4f3
cleaner LuanState.onClose()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 27 May 2015 03:12:28 -0600 |
parents | 8dcf9e12446b |
children | 3058870cbe83 |
line wrap: on
line source
java() local Luan = require "luan:Luan" local pairs = Luan.pairs local ipairs = Luan.ipairs local type = Luan.type local error = Luan.error local Table = require "luan:Table" 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 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 Sort = require "java:org.apache.lucene.search.Sort" local SortField = require "java:org.apache.lucene.search.SortField" local M = {} function M.index(indexDir) local index = {} local java_index = LuceneIndex.new(indexDir) index.fields = java_index.fields.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) index.Writer( function(writer) writer.save_document(doc) end ) end function index.delete_documents(terms) index.Writer( function(writer) writer.delete_documents(terms) end ) end function index.get_first(query, sort) return index.Searcher( function(searcher) local results, _, total_hits = searcher.search(query,1,sort) return results(), total_hits end ) end function index.get_document(query) local doc, total_hits = index.get_first(query); if total_hits > 1 then error( "found " .. total_hits .. " documents" ) end return doc end function index.count(query) return index.Searcher( function(searcher) local _, _, total_hits = searcher.search(query,0) return total_hits end ) end local queryTbl = {} index.query = queryTbl queryTbl.parse = java_index.parse queryTbl.all_docs = MatchAllDocsQuery.new() function queryTbl.term(t) local iter = pairs(t) local field, value = iter() field and value or error "missing term" iter()==nil or error "only one term allowed" field = index.map_field_name(field) return TermQuery.new(Term.new(field,value)) 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(Table.unpack(a)) end return index end return M