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 <https://bitbucket.org/mchaput/whoosh/wiki/Home>`_ with the ORM of `SQLAlchemy <http://www.sqlalchemy.org/>`_ for use in `Flask <http://flask.pocoo.org/>`_ applications.
Source code and issue tracking at `GitHub <http://github.com/gyllstromk/Flask-WhooshAlchemy>`_.
View the official docs at http://packages.python.org/Flask-WhooshAlchemy/.
Install
-------
::
pip install flask_whooshalchemy
Or:
::
git clone https://github.com/gyllstromk/Flask-WhooshAlchemy.git
Quickstart
----------
Let's set up the environment and create our model:
::
from whoosh.analysis import StemmingAnalyzer
import flask.ext.whooshalchemy
# set the location for the whoosh index
app.config['WHOOSH_BASE'] = 'path/to/whoosh/base'
# set the global analyzer, defaults to StemmingAnalyzer.
app.config['WHOOSH_ANALYZER'] = StemmingAnalyzer()
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)
Only four steps to get started:
(Actually, only the third one is required for using, others are all optional.)
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) Set the ``WHOOSH_ANALYZER`` to the global analyzer. If not set, it will defalt to ``StemmingAnalyzer``.
3) Add a ``__searchable__`` field to the model which specifies the fields (as ``str`` s) to be indexed .
4) Add a ``__analyzer__`` field to the model if you need a local custom analyzer for indexing.
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)
===============================
Flask-WhooshAlchemy is a Flask extension that integrates the text-search functionality of `Whoosh <https://bitbucket.org/mchaput/whoosh/wiki/Home>`_ with the ORM of `SQLAlchemy <http://www.sqlalchemy.org/>`_ for use in `Flask <http://flask.pocoo.org/>`_ applications.
Source code and issue tracking at `GitHub <http://github.com/gyllstromk/Flask-WhooshAlchemy>`_.
View the official docs at http://packages.python.org/Flask-WhooshAlchemy/.
Install
-------
::
pip install flask_whooshalchemy
Or:
::
git clone https://github.com/gyllstromk/Flask-WhooshAlchemy.git
Quickstart
----------
Let's set up the environment and create our model:
::
from whoosh.analysis import StemmingAnalyzer
import flask.ext.whooshalchemy
# set the location for the whoosh index
app.config['WHOOSH_BASE'] = 'path/to/whoosh/base'
# set the global analyzer, defaults to StemmingAnalyzer.
app.config['WHOOSH_ANALYZER'] = StemmingAnalyzer()
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)
Only four steps to get started:
(Actually, only the third one is required for using, others are all optional.)
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) Set the ``WHOOSH_ANALYZER`` to the global analyzer. If not set, it will defalt to ``StemmingAnalyzer``.
3) Add a ``__searchable__`` field to the model which specifies the fields (as ``str`` s) to be indexed .
4) Add a ``__analyzer__`` field to the model if you need a local custom analyzer for indexing.
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)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file Flask-WhooshAlchemy-0.8.tar.gz.
File metadata
- Download URL: Flask-WhooshAlchemy-0.8.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45bd638d2ded106d955b9924f27f7ee41c48fbdd5a1fd6b2a892180354006d10
|
|
| MD5 |
c9617008076bbf97b2d78f69179872f6
|
|
| BLAKE2b-256 |
f6fac730a77735de591f405ede4fc524e453af9d10f6b79e67c33591ebd7cdea
|