Skip to content

Instantly share code, notes, and snippets.

@cjgiridhar
Created September 26, 2012 08:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cjgiridhar/3786711 to your computer and use it in GitHub Desktop.
Save cjgiridhar/3786711 to your computer and use it in GitHub Desktop.
Torando - Whoosh - MoreLike
import whoosh,os
from whoosh import index
import whoosh.index
import whoosh.fields
import whoosh.qparser
import tornado.ioloop
import tornado.web
class Search(object):
def __init__(self, indexdir, searchstr=None):
self.indexdir = indexdir
self.searchstr = searchstr
def searcher(self):
schema = whoosh.fields.Schema(
path = whoosh.fields.ID(unique=True, stored=True),
title = whoosh.fields.TEXT(stored=True, phrase=False),
content = whoosh.fields.TEXT(stored=True),
tag = whoosh.fields.TEXT(stored=True),
category = whoosh.fields.TEXT(stored=True))
if not os.path.exists(self.indexdir):
os.mkdir(self.indexdir)
ix = index.create_in(self.indexdir, schema)
writer = ix.writer()
writer.add_document(title=u"Welcome", content=u"This is welcome blog!",
path=u"/welcome", tag=u"Welcome", category=u"Welcome")
writer.add_document(title=u"Python Whoosh", content=u"Whoosh search library in pure Python",
path=u"/whoosh", tag=u"whoosh", category=u"Search")
writer.add_document(title=u"Python Tornado", content=u"Tornado Web Server for real-time web apps",
path=u"/tornado", tag=u"tornado", category=u"Web Server")
writer.add_document(title=u"Python Tornado Async", content=u"Tornado Web Server provides async web requests",
path=u"/tornadoasync", tag=u"async", category=u"Web Server")
writer.add_document(title=u"Python Tornado Templates", content=u"Tornado Web Server has template feature",
path=u"/tornadotemplates", tag=u"templates", category=u"Web Server")
writer.add_document(title=u"Python Tornado", content=u"Tornado Web Server is awesome",
path=u"/tornado", tag=u"great", category=u"Web Server")
writer.commit()
_queryparser = whoosh.qparser.QueryParser('content', schema=schema)
s = ix.searcher()
class Home(tornado.web.RequestHandler):
def get(self):
self.write('It Works!')
class MoreLikeThis(tornado.web.RequestHandler):
def get(self):
self.render('morelikethis.html')
def post(self):
path = self.get_argument('path')
print path
srch = Search('./indexer')
s = srch.searcher()
docnum = s.document_number(path=path)
print docnum
r = s.more_like(docnum, 'content')
head = "<h3>Documents like more like %s</h3><br />" %path
head1 = "<h3>Documents like more like this %s</h3><br />" %path
hits = ''; subhits = ''
for hit in r:
hits += "Title: " + hit["title"] + " Tag: " + hit["tag"] + " Category: " + hit["category"] + "<br />"
for subhit in hit.more_like_this("content", top=1):
subhits += "Title: " + subhit["title"] + " Tag: " + subhit["tag"] + "<br />"
self.write(head+hits+head1+subhits)
application = tornado.web.Application([
(r"/",Home ),
(r"/morelikethis",MoreLikeThis ),
])
if __name__ == "__main__":
application.listen(7777)
tornado.ioloop.IOLoop.instance().start()
@liushuaikobe
Copy link

How to use Whoosh in Tornado asynchronously?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment