2014-04-04 4 views
2

레코드가 채워진 기존 데이터베이스에 대해 .seg 파일을 만들려면 어떻게해야합니까? 호출하여 : 나는 영약 - WhooshAlchemy 인터페이스를 통해 직접 레코드를 삽입하면기존 데이터베이스가있는 Flask-WhooshAlchemy

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

나는 .toc 파일을 얻을 수 있지만 .seg 파일은 생성되고. 따라서 이미 존재하는 모든 레코드는 검색에 포함되지 않습니다.

+0

어떻게해야하는지 알 수 없기 때문에 모든 레코드를 다시 삽입했습니다. –

답변

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 - 병렬
  • 에서 사용하는 코어 - "최대"메가 바이트는
  • procs를 사용하는

8 코어 AWS 인스턴스에서 약 360,000 개의 레코드를 인덱싱하는 데 사용했습니다. 약 4 분이 걸렸습니다. 대부분이 (단일 스레드) commit()을 기다리고있었습니다.

pip install flask-whooshalchemyplus 

from flask-whooshalchemyplus import index_all 

index_all(app) 

나는 또한 많은 버그를 몇 가지 새로운 기능을 추가 및 수정 :

+0

고마워요! 이것은 유용 해 보입니다. 마침내 PostgreSQL으로 전환했고 프로젝트를위한 멋진 TSVector입니다. –