Merge branch 'master' of git.xpub.nl:/var/www/git.xpub.nl/repos/xpub-lib
commit
ab7a9c7ef6
@ -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