如何让Flask-WhooshAlchemy为已填充记录的现有数据库创建.seg文件? 致电:
with app.app_context():
whooshalchemy.whoosh_index(app, MappedClass)
我可以获取.toc文件,但只有在我通过Flask-WhooshAlchemy界面直接插入记录时才会创建.seg文件。因此,所有已存在的记录永远不会包含在嗖嗖搜索中。
答案 0 :(得分:2)
Flask-WhooshAlchemy似乎没有维护
您也可以尝试我的前叉https://github.com/Revolution1/Flask-WhooshAlchemyPlus
只是简单地说:
pip install flask-whooshalchemyplus
from flask-whooshalchemyplus import index_all
index_all(app)
我还添加了一些新功能并修复了很多错误。
感谢:)
答案 1 :(得分:1)
这是一个索引现有数据库的脚本。 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
- “max”兆字节使用procs
- 并行使用的核心我用它来索引8核AWS实例上的360,000条记录。花了大约4分钟,其中大部分都在等待(单线程)commit()
。