Alex
7 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