changeset 599:50540f0813e2

support default search fields in lucene; add search to blog;
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 16 Sep 2015 20:55:49 -0600
parents e930f92d0f61
children b926e53910dd
files blog/src/index.html.luan blog/src/lib/Db_mod.luan blog/src/lib/Post.luan blog/src/site.css lucene/ext/sane-lucene-queryparser.jar lucene/src/luan/modules/lucene/Lucene.luan lucene/src/luan/modules/lucene/LuceneIndex.java
diffstat 7 files changed, 73 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/blog/src/index.html.luan	Wed Sep 16 14:32:52 2015 -0600
+++ b/blog/src/index.html.luan	Wed Sep 16 20:55:49 2015 -0600
@@ -8,6 +8,8 @@
 
 
 return function()
+	local query = Http.request.parameter.query
+
 	Io.stdout = Http.response.text_writer()
 %>
 <html>
@@ -17,12 +19,18 @@
 		</style>
 	</head>
 	<body>
-		<h1>Demo Blog App</h1>
+		<h1><a href="/">Demo Blog App</a></h1>
+
+		<form>
+			<input name=query type=text value="<%= query or "" %>">
+			<input type=submit value=Search>
+		</form>
 
 		<div><a href="new">Make New Post</a></div>
 
 		<%
-		for _, post in ipairs(Post.get_all()) do
+		local posts = query and Post.search(query) or Post.get_all()
+		for _, post in ipairs(posts) do
 			%>
 			<a name="p<%= post.id %>">
 			<h2><%= post.subject %></h2>
--- a/blog/src/lib/Db_mod.luan	Wed Sep 16 14:32:52 2015 -0600
+++ b/blog/src/lib/Db_mod.luan	Wed Sep 16 20:55:49 2015 -0600
@@ -8,7 +8,7 @@
 
 function M.new_db()
 	local dir = Io.uri(M.lucene_dir).to_string()
-	local db = Lucene.index(dir)
+	local db = Lucene.index( dir, Lucene.type.english, {"subject","content"} )
 	
 --	this is how you index a field
 --	db.indexed_fields.post_date = Lucene.type.long
--- a/blog/src/lib/Post.luan	Wed Sep 16 14:32:52 2015 -0600
+++ b/blog/src/lib/Post.luan	Wed Sep 16 20:55:49 2015 -0600
@@ -4,6 +4,8 @@
 local assert_string = Luan.assert_string or error()
 local Time = require "luan:Time"
 local now = Time.now or error()
+local String = require "luan:String"
+local trim = String.trim or error()
 local Db = require "site:/lib/Db"
 
 
@@ -52,4 +54,17 @@
 	return posts
 end
 
+function M.search(query)
+	query = trim(query)
+	if #query == 0 then
+		return M.get_all()
+	end
+	local docs = Db.search(query,1,1000)
+	local posts = {}
+	for _, doc in ipairs(docs) do
+		posts[#posts+1] = from_doc(doc)
+	end
+	return posts
+end
+
 return M
--- a/blog/src/site.css	Wed Sep 16 14:32:52 2015 -0600
+++ b/blog/src/site.css	Wed Sep 16 20:55:49 2015 -0600
@@ -15,3 +15,25 @@
 a[href]:hover {
 	text-decoration: underline;
 }
+
+
+input[type="text"], input[type="email"] {
+	font: inherit;
+	padding: .5em .8em;
+	border-radius: 4px;
+	border-style: groove;
+}
+input[type="text"]:focus, input[type="email"]:focus {
+	border-color: #66afe9;
+	outline: none;
+}
+input[type="submit"] {
+	font: inherit;
+	padding: .5em;
+	border-radius: 4px;
+	background: #eee;
+	border-color: #eee;
+}
+input[type="submit"]:hover {
+	background: #ddd !important;
+}
Binary file lucene/ext/sane-lucene-queryparser.jar has changed
--- a/lucene/src/luan/modules/lucene/Lucene.luan	Wed Sep 16 14:32:52 2015 -0600
+++ b/lucene/src/luan/modules/lucene/Lucene.luan	Wed Sep 16 20:55:49 2015 -0600
@@ -3,7 +3,10 @@
 local error = Luan.error
 local LuceneIndex = require "java:luan.modules.lucene.LuceneIndex"
 local NumberFieldParser = require "java:sane.lucene.queryparser.NumberFieldParser"
+local StringFieldParser = require "java:sane.lucene.queryparser.StringFieldParser"
 local SaneQueryParser = require "java:sane.lucene.queryparser.SaneQueryParser"
+local Version = require "java:org.apache.lucene.util.Version"
+local EnglishAnalyzer = require "java:org.apache.lucene.analysis.en.EnglishAnalyzer"
 
 
 local M = {}
@@ -13,14 +16,16 @@
 	integer = NumberFieldParser.INT;
 	long = NumberFieldParser.LONG;
 	double = NumberFieldParser.DOUBLE;
+
+	english = StringFieldParser.new(EnglishAnalyzer.new(Version.LUCENE_CURRENT))
 }
 
 M.literal = SaneQueryParser.literal
 
-function M.index(index_dir)
+function M.index(index_dir,default_type,default_fields)
 	local index = {}
 	index.dir = index_dir
-	local java_index = LuceneIndex.new(index_dir)
+	local java_index = LuceneIndex.new(index_dir,default_type,default_fields)
 	index.indexed_fields = java_index.indexedFieldsMeta.newTable()
 	index.to_string = java_index.to_string
 	index.backup = java_index.backup
--- a/lucene/src/luan/modules/lucene/LuceneIndex.java	Wed Sep 16 14:32:52 2015 -0600
+++ b/lucene/src/luan/modules/lucene/LuceneIndex.java	Wed Sep 16 20:55:49 2015 -0600
@@ -20,6 +20,7 @@
 import org.apache.lucene.document.Field;
 import org.apache.lucene.document.StoredField;
 import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.TextField;
 import org.apache.lucene.document.IntField;
 import org.apache.lucene.document.LongField;
 import org.apache.lucene.document.DoubleField;
@@ -69,8 +70,7 @@
 	private static final Logger logger = LoggerFactory.getLogger(LuceneIndex.class);
 
 	private static final String FLD_NEXT_ID = "nextId";
-	private static final Analyzer analyzer = new KeywordAnalyzer();
-	public static final FieldParser STRING_FIELD_PARSER = new StringFieldParser(analyzer);
+	public static final StringFieldParser STRING_FIELD_PARSER = new StringFieldParser(new KeywordAnalyzer());
 
 	private final ReentrantLock writeLock = new ReentrantLock();
 	private final File indexDir;
@@ -80,15 +80,21 @@
 	private IndexSearcher searcher;
 	private final ThreadLocal<IndexSearcher> threadLocalSearcher = new ThreadLocal<IndexSearcher>();
 	private boolean isClosed = false;
-	private final MultiFieldParser mfp = new MultiFieldParser();
+	private final MultiFieldParser mfp;
 
-	public LuceneIndex(LuanState luan,String indexDirStr) throws LuanException, IOException {
+	public LuceneIndex(LuanState luan,String indexDirStr,FieldParser defaultFieldParser,String[] defaultFields) throws LuanException, IOException {
+		mfp = defaultFieldParser==null ? new MultiFieldParser() : new MultiFieldParser(defaultFieldParser,defaultFields);
 		mfp.fields.put( "type", STRING_FIELD_PARSER );
 		mfp.fields.put( "id", NumberFieldParser.LONG );
 		File indexDir = new File(indexDirStr);
 		this.indexDir = indexDir;
 		Directory dir = FSDirectory.open(indexDir);
-		Version version = Version.LUCENE_4_9;
+		Version version = Version.LUCENE_4_9;		
+		Analyzer analyzer = STRING_FIELD_PARSER.analyzer;
+		if( defaultFieldParser instanceof StringFieldParser ) {
+			StringFieldParser sfp = (StringFieldParser)defaultFieldParser;
+			analyzer = sfp.analyzer;
+		}
 		IndexWriterConfig conf = new IndexWriterConfig(version,analyzer);
 		snapshotDeletionPolicy = new SnapshotDeletionPolicy(conf.getIndexDeletionPolicy());
 		conf.setIndexDeletionPolicy(snapshotDeletionPolicy);
@@ -415,8 +421,13 @@
 			Object value = entry.getValue();
 			if( value instanceof String ) {
 				String s = (String)value;
-				if( indexed.contains(name) ) {
-					doc.add(new StringField(name, s, Field.Store.YES));
+				FieldParser fp = mfp.fields.get(name);
+				if( fp != null ) {
+					if( fp instanceof StringFieldParser && fp != STRING_FIELD_PARSER ) {
+						doc.add(new TextField(name, s, Field.Store.YES));
+					} else {
+						doc.add(new StringField(name, s, Field.Store.YES));
+					}
 				} else {
 					doc.add(new StoredField(name, s));
 				}