2012-12-11 15 views
12

Używam Django Haystack już od jakiegoś czasu i jest świetnie! Mam dość ciężką stronę z danymi, które muszą być aktualizowane od czasu do czasu (od 15 do 30 minut).Indeks aktualizacji Django Haystack szybciej

Podczas korzystania z python manage.py update_index aktualizacja danych zajmuje dużo czasu. Czy istnieje sposób, aby to przyspieszyć? A może zaktualizuj tylko zmienione dane, jeśli to możliwe ..

Obecnie używam Django Haystack 1.2.7 z Solr jako backend i Django 1.4.

Dzięki!


EDIT:

Tak próbowałem czytać tę część dokumentacji, ale to, co naprawdę potrzebne jest sposobem, aby przyspieszyć indeksowanie w górę. Może aktualizować tylko najnowsze dane zamiast aktualizować wszystkie. Znalazłem get_updated_field, ale nie wiem, jak z niego korzystać. W dokumentacji wspomniano tylko, dlaczego jest używany, ale nie pokazano żadnych prawdziwych przykładów.


EDIT 2:

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

EDIT 3:

Ok i zaimplementowaniu ryk rozwiązanie, ale gdy próbowałem rebuild_index (z 45000 danych) prawie rozbił mój komputer . Po 10 minutach czekania pojawił się błąd:

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

Czy próbowałeś niektórych rzeczy w dokumencie najlepszych praktyk? http://django-haystack.readthedocs.org/en/latest/best_practices.html#ref-best-practices – Spacedman

+0

Nie korzystałem z backendu solr, więc nie mogę ci pomóc, przepraszam. –

Odpowiedz

19

get_updated_field powinien zwrócić ciąg znaków, który zawiera nazwę atrybutu na modelu, który zawiera datę, że model został zaktualizowany (haystack docs). A DateField z auto_now = True byłby idealny do tego (Django docs).

Na przykład, mój model UserProfile ma pole o nazwie aktualizowane

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" 

Wtedy gdy uruchamiam go tylko ./manage.py update_index --age=10 indeksuje profile użytkowników zaktualizowane w ciągu ostatnich 10 godzin.

+0

Gdzie powinienem dodać auto_now = True w search_indexes.py? Zrobiłem przykład w moim pytaniu powyżej. Gdzie dokładnie powinienem wdrożyć get_updated_field. Dzięki za odpowiedź!! – dark4p

+0

Funkcja auto_now mogłaby przejść do Modelu w models.py, funkcja get_updated_field trafiłaby do klasy SearchIndex. –

+0

Dodałem przykład. –

Powiązane problemy