2012-12-11 18 views
12

Django Haystack'ı bir süredir kullanıyorum ve bu harika! Zaman zaman güncellenmesi gereken (15 ila 30 dakika) veri içeren oldukça ağır bir sitem var. Django Haystack güncelleme endeksi daha hızlı

veriyi güncellemek için çok zaman alır python manage.py update_index kullanırken. Bunu hızlandırmanın bir yolu var mı? Mümkünse Ya da belki sadece değiştirilen veri güncelleme ..

Şu anda arka uç ve Django 1.4 olarak Solr ile Django Haystack 1.2.7 kullanıyorum.

Teşekkürler!


DÜZENLEME:

Evet belgelerin bir kısmının okuma çalıştı ama ne gerçekten ihtiyacım indeksleme hızlandırmak için bir yoldur ettik. Belki de tümünü güncelleştirmek yerine yalnızca son verileri güncelleyin. get_updated_field'u buldum ama nasıl kullanacağımı bilmiyorum. Dokümantasyonda neden kullanıldığını ancak gerçek örneklerin gösterilmediğini belirtmiştir.


DÜZENLEME 2:

start = DateTimeField(model_attr='start', null=True, faceted=True, --HERE?--) 

DÜZENLEME 3:

Ok i çözüm feryat uyguladık ama (45000 verilerle) rebuild_index çalıştığımızda neredeyse bilgisayarımı çöktü . Bir hata bekleyen 10 dakika sonra ortaya çıktı:

File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 443, in execute_from_command_line 
    utility.execute() 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/rebuild_index.py", line 16, in handle 
    call_command('update_index', **options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 150, in call_command 
    return klass.execute(*args, **defaults) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 193, in handle 
    return super(Command, self).handle(*apps, **options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 304, in handle 
    app_output = self.handle_app(app, **options) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 229, in handle_app 
    do_update(index, qs, start, end, total, self.verbosity) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 109, in do_update 
    index.backend.update(index, current_qs) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/backends/solr_backend.py", line 73, in update 
    self.conn.add(docs, commit=commit, boost=index.get_field_weights()) 
    File "/usr/local/lib/python2.7/dist-packages/pysolr.py", line 686, in add 
    m = ET.tostring(message, encoding='utf-8') 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1127, in tostring 
    ElementTree(element).write(file, encoding, method=method) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 821, in write 
    serialize(write, self._root, encoding, qnames, namespaces) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 940, in _serialize_xml 
    _serialize_xml(write, e, encoding, qnames, None) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 940, in _serialize_xml 
    _serialize_xml(write, e, encoding, qnames, None) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 915, in _serialize_xml 
    write("<" + tag) 
MemoryError 
+0

En İyi Uygulamalar belgesinde bazı şeyleri denediniz mi? http://django-haystack.readthedocs.org/en/latest/best_practices.html#ref-best-practices – Spacedman

+0

Ben Solr arka uç yüzden üzgünüm, orada size yardımcı olamaz kullanılmaz ettik. –

cevap

19

get_updated_field modeli güncellenmiştir o tarih (haystack docs) içeren model üzerinde özelliğin adını içeren bir dize dönmelidir. Auto_now = True ile bir DateField bunun için idealdir (Django docs). Ben sadece ./manage.py update_index --age=10 çalıştırdığınızda

Örneğin

, benim UserProfile modeli

class UserProfileIndex(SearchIndex): 
    text = CharField(document=True, use_template=True) 
    user = CharField(model_attr='user') 
    user_fullname = CharField(model_attr='user__get_full_name') 

    def get_model(self): 
     return UserProfile 

    def get_updated_field(self): 
     return "updated" 

Sonra güncellenen adlı bir alan

models.py

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    # lots of other fields snipped 
    updated = models.DateTimeField(auto_now=True) 

search_indexes.py vardır Son 10 saat içinde güncellenen kullanıcı profillerini endeksler.

+0

search_indexes.py dosyasında auto_now = True öğesini nereye ekmeliyim? Yukarıdaki soruma bir örnek verdim. Ayrıca tam olarak nerede get_updated_field kullanmalıyım. Cevabınız için teşekkürler!! – dark4p

+0

auto_now, Model.py'de Model'e giderdi, get_updated_field işlevi, SearchIndex sınıfında giderdi. –

+0

Bir örnek ekledim. –