view lucene/src/luan/modules/lucene/Lucene.luan @ 287:4d53e9fc1bd9

change lucene search to take lucene objects git-svn-id: https://luan-java.googlecode.com/svn/trunk@288 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 04 Dec 2014 09:27:20 +0000
parents eb27e765affb
children 899253043270
line wrap: on
line source

import "luan:Table"
import "luan:Java"
import "java:luan.modules.lucene.LuceneIndex"
import "java:org.apache.lucene.index.Term"
import "java:org.apache.lucene.search.TermQuery"
import "java:org.apache.lucene.search.MatchAllDocsQuery"
import "java:org.apache.lucene.search.BooleanQuery"
import "java:org.apache.lucene.search.BooleanClause"
import "java:org.apache.lucene.search.Sort"
import "java:org.apache.lucene.search.SortField"


function Index(indexDir)
	local index = LuceneIndex.new(indexDir).table()

	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 Query = {}
	index.Query = Query

	Query.all_docs = MatchAllDocsQuery.new()
	
	function Query.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 Query.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 Query.all(t)
		local bt = {}
		for key, query in pairs(t) do
			if type(key)=="string" then
				query = Query.term{[key]=query}
			end
			bt[query] = "MUST"
		end
		return Query.boolean(bt)
	end
	
	-- or list
	function Query.any(t)
		local bt = {}
		for key, query in pairs(t) do
			if type(key)=="string" then
				query = Query.term{[key]=query}
			end
			bt[query] = "SHOULD"
		end
		return Query.boolean(bt)
	end
	
	
	function Query.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 type = SortField.Type.valueOf( f.type.upper() )
			local reverse = f.reverse or false
			a[#a+1] = SortField.new(f.field,type,reverse)
		end
		return Sort.new(Table.unpack(a))
	end


	return index
end