Whoosh extension to Flask/SQLAlchemy
Project description
Welcome to Flask-WhooshAlchemy!
===============================
Flask-WhooshAlchemy is a Flask extension that integrates the text-search functionality of Whoosh_ with the ORM of SQLAlchemy_ for use in Flask_ applications.
Source code and issue tracking at GitHub_.
View the official docs here_.
Install
-------
::
pip install flask_whooshalchemy_redux
Or:
::
git clone https://github.com/dhamaniasad/Flask-WhooshAlchemy.git
Quickstart
----------
Let's set up the environment and create our model:
::
import flask.ext.whooshalchemy as whooshalchemy
# set the location for the whoosh index
app.config['WHOOSH_BASE'] = 'path/to/whoosh/base'
class BlogPost(db.Model):
__tablename__ = 'blogpost'
__searchable__ = ['title', 'content'] # these fields will be indexed by whoosh
__analyzer__ = SimpleAnalyzer() # configure analyzer; defaults to
# StemmingAnalyzer if not specified
id = app.db.Column(app.db.Integer, primary_key=True)
title = app.db.Column(app.db.Unicode) # Indexed fields are either String,
content = app.db.Column(app.db.Text) # Unicode, or Text
created = db.Column(db.DateTime, default=datetime.datetime.utcnow)
whooshalchemy.whoosh_index(app, BlogPost)
Only two steps to get started:
1) Set the ``WHOOSH_BASE`` to the path for the whoosh index. If not set, it will default to a directory called 'whoosh_index' in the directory from which the application is run.
2) Add a ``__searchable__`` field to the model which specifies the fields (as ``str`` s) to be indexed .
Let's create a post:
::
db.session.add(
BlogPost(title='My cool title', content='This is the first post.')
); db.session.commit()
After the session is committed, our new ``BlogPost`` is indexed. Similarly, if the post is deleted, it will be removed from the Whoosh index.
Text Searching
--------------
To execute a simple search:
::
results = BlogPost.query.whoosh_search('cool')
This will return all ``BlogPost`` instances in which at least one indexed field (i.e., 'title' or 'content') is a text match to the query. Results are ranked according to their relevance score, with the best match appearing first when iterating. The result of this call is a (subclass of) :class:`sqlalchemy.orm.query.Query` object, so you can chain other SQL operations. For example::
two_days_ago = datetime.date.today() - datetime.timedelta(2)
recent_matches = BlogPost.query.whoosh_search('first').filter(
BlogPost.created >= two_days_ago)
Or, in alternative (likely slower) order::
recent_matches = BlogPost.query.filter(
BlogPost.created >= two_days_ago).whoosh_search('first')
We can limit results::
# get 2 best results:
results = BlogPost.query.whoosh_search('cool', limit=2)
By default, the search is executed on all of the indexed fields as an OR conjunction. For example, if a model has 'title' and 'content' indicated as ``__searchable__``, a query will be checked against both fields, returning any instance whose title or content are a content match for the query. To specify particular fields to be checked, populate the ``fields`` parameter with the desired fields::
results = BlogPost.query.whoosh_search('cool', fields=('title',))
By default, results will only be returned if they contain all of the query terms (AND). To switch to an OR grouping, set the ``or_`` parameter to ``True``::
results = BlogPost.query.whoosh_search('cool', or_=True)
.. _GitHub: https://github.com/dhamaniasad/Flask-WhooshAlchemy
.. _Whoosh: https://bitbucket.org/mchaput/whoosh/wiki/Home
.. _SQLAlchemy: http://www.sqlalchemy.org/
.. _Flask: http://flask.pocoo.org/
.. _here: https://Flask-WhooshAlchemy.readthedocs.org/
===============================
Flask-WhooshAlchemy is a Flask extension that integrates the text-search functionality of Whoosh_ with the ORM of SQLAlchemy_ for use in Flask_ applications.
Source code and issue tracking at GitHub_.
View the official docs here_.
Install
-------
::
pip install flask_whooshalchemy_redux
Or:
::
git clone https://github.com/dhamaniasad/Flask-WhooshAlchemy.git
Quickstart
----------
Let's set up the environment and create our model:
::
import flask.ext.whooshalchemy as whooshalchemy
# set the location for the whoosh index
app.config['WHOOSH_BASE'] = 'path/to/whoosh/base'
class BlogPost(db.Model):
__tablename__ = 'blogpost'
__searchable__ = ['title', 'content'] # these fields will be indexed by whoosh
__analyzer__ = SimpleAnalyzer() # configure analyzer; defaults to
# StemmingAnalyzer if not specified
id = app.db.Column(app.db.Integer, primary_key=True)
title = app.db.Column(app.db.Unicode) # Indexed fields are either String,
content = app.db.Column(app.db.Text) # Unicode, or Text
created = db.Column(db.DateTime, default=datetime.datetime.utcnow)
whooshalchemy.whoosh_index(app, BlogPost)
Only two steps to get started:
1) Set the ``WHOOSH_BASE`` to the path for the whoosh index. If not set, it will default to a directory called 'whoosh_index' in the directory from which the application is run.
2) Add a ``__searchable__`` field to the model which specifies the fields (as ``str`` s) to be indexed .
Let's create a post:
::
db.session.add(
BlogPost(title='My cool title', content='This is the first post.')
); db.session.commit()
After the session is committed, our new ``BlogPost`` is indexed. Similarly, if the post is deleted, it will be removed from the Whoosh index.
Text Searching
--------------
To execute a simple search:
::
results = BlogPost.query.whoosh_search('cool')
This will return all ``BlogPost`` instances in which at least one indexed field (i.e., 'title' or 'content') is a text match to the query. Results are ranked according to their relevance score, with the best match appearing first when iterating. The result of this call is a (subclass of) :class:`sqlalchemy.orm.query.Query` object, so you can chain other SQL operations. For example::
two_days_ago = datetime.date.today() - datetime.timedelta(2)
recent_matches = BlogPost.query.whoosh_search('first').filter(
BlogPost.created >= two_days_ago)
Or, in alternative (likely slower) order::
recent_matches = BlogPost.query.filter(
BlogPost.created >= two_days_ago).whoosh_search('first')
We can limit results::
# get 2 best results:
results = BlogPost.query.whoosh_search('cool', limit=2)
By default, the search is executed on all of the indexed fields as an OR conjunction. For example, if a model has 'title' and 'content' indicated as ``__searchable__``, a query will be checked against both fields, returning any instance whose title or content are a content match for the query. To specify particular fields to be checked, populate the ``fields`` parameter with the desired fields::
results = BlogPost.query.whoosh_search('cool', fields=('title',))
By default, results will only be returned if they contain all of the query terms (AND). To switch to an OR grouping, set the ``or_`` parameter to ``True``::
results = BlogPost.query.whoosh_search('cool', or_=True)
.. _GitHub: https://github.com/dhamaniasad/Flask-WhooshAlchemy
.. _Whoosh: https://bitbucket.org/mchaput/whoosh/wiki/Home
.. _SQLAlchemy: http://www.sqlalchemy.org/
.. _Flask: http://flask.pocoo.org/
.. _here: https://Flask-WhooshAlchemy.readthedocs.org/
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Close
Hashes for Flask-WhooshAlchemy-Redux-0.6.2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 68fa323b317208f73e56c6f2085a502026cbeb9f103916c9a9bf3210a84181e6 |
|
MD5 | 03dea11bcf3b4581ad5dcba81a305478 |
|
BLAKE2b-256 | b8329ba48d750ee4251fe05bf05ba999014b7a1eee29e42800c41b55cf20865d |