Индекс обновления Django Haystack быстрее
Я уже долгое время использовал Django Haystack, и это здорово! У меня довольно тяжелый сайт с данными, которые нужно время от времени обновлять (от 15 до 30 минут).
При использовании python manage.py update_index
требуется много времени для обновления данных. Есть ли способ ускорить это? Или, возможно, обновить только измененные данные, если это возможно.
В настоящее время я использую Django Haystack 1.2.7 с Solr в качестве backend и Django 1.4.
Спасибо!!!
EDIT:
Да, я пробовал прочитать эту часть документации, но мне действительно нужен способ ускорить индексирование. Возможно, обновить только последние данные, а не обновлять все. Я нашел get_updated_field
, но не знаю, как его использовать. В документации упоминалось только, почему он использовался, но не показаны реальные примеры.
ИЗМЕНИТЬ 2:
start = DateTimeField(model_attr='start', null=True, faceted=True, --HERE?--)
ИЗМЕНИТЬ 3:
Хорошо, я реализовал решение ниже, но когда я попытался rebuild_index (с 45000 данными), он почти разбил мой компьютер. Через 10 минут ожидания появилась ошибка:
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
Ответы
Ответ 1
get_updated_field
должен возвращать строку, содержащую имя атрибута модели, которая содержит дату обновления модели (haystack docs). DateField с auto_now = True был бы идеальным для этого (Django docs).
Например, моя модель UserProfile имеет поле с обновленным
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"
Затем, когда я запускаю ./manage.py update_index --age=10
, он только индексирует профили пользователей, обновленные за последние 10 часов.