Alex
6 years ago
10 changed files with 104 additions and 49 deletions
@ -0,0 +1,57 @@ |
|||||
|
|
||||
|
import datetime |
||||
|
from app import app, models |
||||
|
import whoosh |
||||
|
import flask_whooshalchemyplus |
||||
|
|
||||
|
|
||||
|
""" |
||||
|
Rebuild all Whoosh search indices |
||||
|
Useful after manually importing data (side-stepping the SQLAlchemy ORM |
||||
|
and automatic Whoosh index updates) |
||||
|
If this is intended as a full rebuild, you should consider deleting the |
||||
|
Whoosh search database (as specified in app.config["WHOOSH_BASE"]) |
||||
|
before running the rebuild. This will ensure that no old/stale |
||||
|
data is left in the search indices (this process doesn't delete removed |
||||
|
data, only recreated search entries for current data). |
||||
|
""" |
||||
|
|
||||
|
|
||||
|
program_start = datetime.datetime.utcnow() |
||||
|
|
||||
|
def log(message): |
||||
|
logtime = datetime.datetime.utcnow() |
||||
|
logdiff = logtime - program_start |
||||
|
print("{0} (+{1:.3f}): {2}".format(logtime.strftime("%Y-%m-%d %H:%M:%S"), |
||||
|
logdiff.total_seconds(), |
||||
|
message)) |
||||
|
|
||||
|
def rebuild_index(model): |
||||
|
"""Rebuild search index of Flask-SQLAlchemy model""" |
||||
|
log("Rebuilding {0} index...".format(model.__name__)) |
||||
|
primary_field = model.pure_whoosh.primary_key_name |
||||
|
searchables = model.__searchable__ |
||||
|
index_writer = flask_whooshalchemyplus.whoosh_index(app, model) |
||||
|
|
||||
|
# Fetch all data |
||||
|
entries = model.query.all() |
||||
|
|
||||
|
entry_count = 0 |
||||
|
with index_writer.writer() as writer: |
||||
|
for entry in entries: |
||||
|
index_attrs = {} |
||||
|
for field in searchables: |
||||
|
index_attrs[field] = str(getattr(entry, field)) |
||||
|
|
||||
|
index_attrs[primary_field] = str(getattr(entry, primary_field)) |
||||
|
writer.update_document(**index_attrs) |
||||
|
entry_count += 1 |
||||
|
|
||||
|
log("Rebuilt {0} {1} search index entries.".format(str(entry_count), model.__name__)) |
||||
|
|
||||
|
|
||||
|
if __name__ == "__main__": |
||||
|
model_list = [models.Book] |
||||
|
|
||||
|
for model in model_list: |
||||
|
rebuild_index(model) |
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue