Flask-WhooshAlchemy с существующей базой данных
Как я могу заставить Flask-WhooshAlchemy создавать файлы.seg для уже существующей базы данных, заполненной записями? По телефону:
with app.app_context():
whooshalchemy.whoosh_index(app, MappedClass)
Я могу получить файл.toc, но файлы.seg будут созданы только после того, как я вставлю запись напрямую через интерфейс Flask-WhooshAlchemy. Таким образом, все уже существующие записи никогда не будут включены в поиск.
2 ответа
Вот скрипт, который индексирует существующую базу данных. FWIW, Whoosh называет это "пакетной индексацией".
Это немного грубо, но это работает:
#!/usr/bin/env python2
import os
import sys
import app
from models import YourModel as Model
from flask.ext.whooshalchemy import whoosh_index
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
atatime = 512
with app.app_context():
index = whoosh_index(app, Model)
searchable = Model.__searchable__
print 'counting rows...'
total = int(Model.query.order_by(None).count())
done = 0
print 'total rows: {}'.format(total)
writer = index.writer(limitmb=10000, procs=16, multisegment=True)
for p in Model.query.yield_per( atatime ):
record = dict([(s, p.__dict__[s]) for s in searchable])
record.update({'id' : unicode(p.id)}) # id is mandatory, or whoosh won't work
writer.add_document(**record)
done += 1
if done % atatime == 0:
print 'c {}/{} ({}%)'.format(done, total, round((float(done)/total)*100,2) ),
print '{}/{} ({}%)'.format(done, total, round((float(done)/total)*100,2) )
writer.commit()
Вы можете поиграть с параметрами:
atatime
- количество записей, извлекаемых из базы данных одновременноlimitmb
- "макс" мегабайт для использованияprocs
- ядра для параллельного использования
Я использовал это для индексации около 360000 записей на 8-ядерном экземпляре AWS. Прошло около 4 минут, большую часть которых ждали (однопоточные) commit()
,
Фляга-свист Алхимия, кажется, не поддерживается
Вы также можете попробовать мой форк https://github.com/Revolution1/Flask-WhooshAlchemyPlus
просто:
pip install flask-whooshalchemyplus
from flask-whooshalchemyplus import index_all
index_all(app)
Я также добавил некоторые новые функции и исправил много ошибок.
Спасибо:)