Mercurial Hosting > luan
view lucene/src/luan/modules/lucene/Web_search.luan @ 357:496d61b1fb5a
implement Http.request.parts
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 14 Apr 2015 11:21:10 -0600 |
parents | fb18724521d2 |
children | 2f5cc9c2cbf0 |
line wrap: on
line source
local Luan = require "luan:Luan" local load = Luan.load local to_number = Luan.to_number local pairs = Luan.pairs local ipairs = Luan.ipairs local range = Luan.range local Io = require "luan:Io" local Http = require "luan:web/Http" local String = require "luan:String" local Html = require "luan:Html" local function form() Html.simply_html_page{ head = function() %> <title>Lucene Query</title> <% end; body = function() %> <div container> <h3 margin-top="1.5em">Lucene Query</h3> <form horizontal name="form0" method="post" margin-top="2em"> <div row> <div colspan=2 align="right"> <label>Query:</label> </div> <div colspan=10> <input name="query" size="80" value="Query.all_docs" autofocus /> <div textcolor="#888">Query examples: <i>Query.term{ type = 'user' }</i> or <i>"type:user AND name:Joe"</i></div> </div> </div> <div row margin-top="1em"> <div colspan=2 align="right"> <label>Max Rows:</label> </div> <div colspan=10> <input name="rows" value="100" size="3" maxlength="5" /></p> </div> </div> <div row margin-top="1em"> <div colspan=2 align="right"> <label>Sort:</label> </div> <div colspan=10> <input name="sort" size="60" /> <div textcolor="#888">Sort examples: Query.sort{{ field = 'id', type='int' }}</div> </div> </div> <div row margin-top="1em"> <div colspan=2></div> <div colspan=10> <input type="submit" textcolor="white" bgcolor="#337ab7" large/> </div> </div> </form> </div> <% end; } end local function result(query,sort,headers,table) Html.simply_html_page{ body = function() %> <div container> <h3 margin-top="1.5em">Lucene Query Results</h3> <div row> <div colspan=2 align="right"> <label>Query:</label> </div> <div colspan=10> <b><%=query%></b></p> </div> </div> <div row> <div colspan=2 align="right"> <label>Sort:</label> </div> <div colspan=10> <b><%=sort%></b></p> </div> </div> <table border condensed margin-top="1.5em"> <tr> <th></th> <% for _, header in ipairs(headers) do %> <th><%=header%></th> <% end %> </tr> <% for i, row in ipairs(table) do %> <tr> <td><%=i%></td> <% for col in range(1, #headers) do %> <td><%= row[col] or "" %></td> <% end %> </tr> <% end %> </table> </div> <% end; } end local function index_of(tbl,val) for i, v in ipairs(tbl) do if v == val then return i end end local n = #tbl + 1 tbl[n] = val return n end function of(index) return { service = function() Io.stdout = Http.response.text_writer() local query_string = Http.request.parameters.query if query_string == nil then form() return end local query = load(query_string,"<query>",{Query=index.Query},true)() local rows = to_number(Http.request.parameters.rows) local sort = load(Http.request.parameters.sort,"<sort>",{Query=index.Query},true)() index.Searcher( function(searcher) local results, length, total_hits = searcher.search(query,rows,sort) local headers = {} local table = {} for doc in results do local row = {} for field, value in pairs(doc) do row[index_of(headers,field)] = value end table[#table+1] = row end result(query,sort,headers,table) end ) end } end