Flask-WhooshAlchemy с существующей базой данных

Как я могу заставить Flask-WhooshAlchemy создать файлы .seg для уже существующей базы данных, заполненной записями? Позвонив:

with app.app_context():
    whooshalchemy.whoosh_index(app, MappedClass)

Я могу получить файл .toc, но файлы .seg будут созданы только после того, как я вставлю запись напрямую через интерфейс Flask-WhooshAlchemy. Таким образом, все уже существующие записи никогда не будут включены в свистящий поиск.


person Sebastian Elsner    schedule 04.04.2014    source источник
comment
В итоге я заново вставил все записи, потому что не мог понять, как это сделать.   -  person Sebastian Elsner    schedule 19.08.2014


Ответы (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 - ядра для параллельного использования

Я использовал это для индексации около 360 000 записей на 8-ядерном экземпляре AWS. На это ушло около 4 минут, большую часть которых ждал (однопоточный) commit().

person Community    schedule 08.03.2015
comment
Благодарю вас! Это выглядит полезным. Наконец-то я переключился на PostgreSQL, и это отличный TSVector для проекта. - person Sebastian Elsner; 10.03.2015

Flask-WhooshAlchemy, кажется, не поддерживается

вы также можете попробовать мой форк https://github.com/Revolution1/Flask-WhooshAlchemyPlus

просто:

pip install flask-whooshalchemyplus

from flask-whooshalchemyplus import index_all

index_all(app)

Я также добавил некоторые новые функции и исправил много ошибок.

Благодарность:)

person Renjie Cai    schedule 03.02.2016