Supports the easy text-indexing of SQLAlchemy model fields.
BSD license.
Written by Stefane Fermigier (http://www.fermigier.com/) based on Flask-WhooshAlchemy written by Karl Gyllstromk.
Import this library:
from whooshalchemy import IndexService
Standard SQLAlchemy imports:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.schema import Column from sqlalchemy.types import Integer, Text, DateTime from sqlalchemy.engine import create_engine from sqlalchemy.orm.session import sessionmaker
Setup SQLAlchemy:
engine = create_engine('sqlite:///:memory:') Session = sessionmaker(bind=engine) session = Session() Base = declarative_base()
Our model:
class BlogPost(Base): ... tablename = 'blogpost' ... searchable = ['title', 'content'] # these fields will be indexed by whoosh ... ... id = Column(Integer, primary_key=True) ... title = Column(Text) ... content = Column(Text) ... ... def repr(self): ... return '{0}(title={1})'.format(self.class.name, self.title) ... Base.metadata.create_all(engine)
Create and init indexing service:
config = {"WHOOSH_BASE": "/tmp/whoosh"} index_service = IndexService(config=config, session=session) index_service.register_class(BlogPost) FileIndex(FileStorage('/tmp/whoosh/BlogPost'), 'MAIN')
Create a blog post:
m = BlogPost(title=u'My cool title', content=u'This is the first post.') session.add(m); session.commit()
Perform a few searches:
list(BlogPost.search_query(u'cool')) [BlogPost(title=My cool title)] list(BlogPost.search_query(u'first')) [BlogPost(title=My cool title)]
Note: the response is a BaseQuery
object, so you can append other SQL operations:
list(BlogPost.search_query(u'first').filter(BlogPost.id >= 0)) [BlogPost(title=My cool title)]
Setup you Flask app, create the db
object (db = SQLAlchemy(app)
), import your models.
Set WHOOSH_BASE
to your Whoosh index directory in your Flask , then create the index service
and register your models:
index_service = IndexService(config=app.config) index_service.register_class(MyFirstModel) index_service.register_class(MySecondModel)
Etc.
Version 0.3.0 (2017/01/09)
- Python 3 compatibility.
- Use pytest instead of nose for tests