2012-12-11 14 views
12

Ho usato Django Haystack per un po 'ora ed è fantastico! Ho un sito piuttosto pesante con dati che devono essere aggiornati di volta in volta (da 15 a 30 minuti).Django Haystack indice di aggiornamento più veloce

Quando si utilizza python manage.py update_index, è necessario molto tempo per aggiornare i dati. C'è un modo per accelerare questo? O forse aggiornare solo i dati modificati, se possibile ..

Attualmente sto usando Django Haystack 1.2.7 con Solr come backend e Django 1.4.

Grazie !!!


EDIT:

Sì ho provato leggendo che parte della documentazione, ma quello che mi ha realmente bisogno è un modo per accelerare l'indicizzazione su. Forse aggiorna solo i dati recenti invece di aggiornarli tutti. Ho trovato get_updated_field ma non so come usarlo. Nella documentazione viene menzionato solo il motivo per cui viene utilizzato, ma non vengono mostrati esempi reali.


EDIT 2:

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

EDIT 3:

Ok ho implementato il soffietto soluzione, ma quando ho provato rebuild_index (con i dati di 45000) quasi caduto il mio computer . Dopo 10 minuti di attesa di un errore è apparso:

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

Hai provato alcune delle cose nel documento Best Practices? http://django-haystack.readthedocs.org/en/latest/best_practices.html#ref-best-practices – Spacedman

+0

Non ho usato il backrind del solr quindi non posso aiutarti, mi dispiace. –

risposta

19

get_updated_field dovrebbe restituire una stringa che contiene il nome dell'attributo sul modello che contiene la data che il modello è stato aggiornato (haystack docs). Un DateField con auto_now = True sarebbe l'ideale per quello (Django docs).

Per esempio, il mio modello UserProfile ha un campo denominato aggiornato

models.py

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

search_indexes.py

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" 

Poi, quando ho eseguito ./manage.py update_index --age=10 solo indicizza i profili utente aggiornati nelle ultime 10 ore.

+0

Dove dovrei aggiungere auto_now = True in search_indexes.py? Ho fatto un esempio nella mia domanda sopra. Anche dove esattamente dovrei implementare get_updated_field. Grazie per la tua risposta!! – dark4p

+0

L'auto_now andrebbe sul modello in models.py, la funzione get_updated_field andrebbe nella classe SearchIndex. –

+0

Ho aggiunto un esempio. –

Problemi correlati