当前位置: 首页 > 知识库问答 >
问题:

Django干草堆更新索引更快

应志用
2023-03-14

我用Django Haystack已经有一段时间了,它很棒!我有一个相当沉重的数据,需要不时更新(15至30分钟)网站。

当使用pythonmanage.pyupdate_index时,需要花费大量时间来更新数据。有没有办法加快速度?或者可能只更新更改的数据,如果可能的话...

我目前正在使用Django Haystack 1.2。7,Solr作为后端,Django 1.4。

谢谢!!!

编辑:

是的,我试过阅读文档的这一部分,但我真正需要的是一种加快索引速度的方法。可能只更新最近的数据,而不是更新所有数据。我找到了get\u updated\u字段,但不知道如何使用它。在文档中只提到了使用它的原因,但没有显示实际的示例。

编辑2:

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

编辑3:

好的,我已经实现了下面的解决方案,但是当我尝试重建索引(有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个答案

阙阳夏
2023-03-14

get_updated_field应该返回一个字符串,该字符串包含模型上属性的名称,该属性包含模型更新的日期(haystack docs)。auto_now=True的DateField将是理想的选择(Django文档)。

例如,我的UserProfile模型有一个名为updated的字段

models.py

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

搜索索引。派克

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.pyupdate_index--age=10时,它只索引过去10小时内更新的用户配置文件。

 类似资料:
  • 假设我有两组对象“Questions”和“Users”,它们共享一个关系。 什么是最好的方法索引我的对象,以允许最新的变化反映在lucene IDEX? 是否应该为用户和问题提供单独的文档,并让lucene根据需要获取所需的问题/用户详细信息? 还是,走数据传输对象的方式?当发生更改时,只需删除这些文档并重新索引?

  • 问题内容: 我使用,,,,,和 每次尝试进行elasticsearch时,我都遇到错误。这是错误: 这是我的配置: 问题答案: 删除> = 2中不再支持的参数存在一个相关问题: 删除目前不支持的增强 在进行此更改之前,使用的是后端映射中的参数。已对master分支进行了更改。您现在可以执行以下操作: 直接从github 安装的开发版本: 在升级到第二版之前将其降级到最新的稳定版本

  • 问题内容: 一旦PriorityQueue中对象的优先级发生更改,Java是否有一种简便的方法来重新评估堆?我在中找不到任何迹象,但是必须有某种方法可以做到这一点,对吗?我当前正在删除对象,然后重新添加它,但这显然比在堆上运行更新要慢。 问题答案: 您可能需要自己实现这样的堆。您需要对项目在堆中的位置有一些处理,并需要有一些方法可以在优先级发生变化时向上或向下推项目。 几年前,我在学校工作中写了这

  • Dart允许修改List中项目的值。 换句话说,可以重写列表项的值。 以下example说明了相同的情况 - void main() { List l = [1, 2, 3]; l[0] = 123; print(l); } 上面的示例使用索引0更新List项的值。代码的输出将为 - [123, 2, 3]

  • 有这么一种常见的情况:整个数据集非常大,以至于难于经常性的重建索引,但是每次新增的记录却相当地少。一个典型的例子是:一个论坛有1000000个已经归档的帖子,但每天只有1000个新帖子。 在这种情况下可以用所谓的“主索引+增量索引”(main+delta)模式来实现“近实时”的索引更新。 这种方法的基本思路是设置两个数据源和两个索引,对很少更新或根本不更新的数据建立主索引,而对新增文档建立增量索引

  • 我正在开发一个开放的博客网站,对于它的搜索功能,我正在使用django haystack的弹性搜索,但问题是每次发布博客文章后,我都需要运行命令-,如何自动生成更新索引?你能告诉我,如果该网站有数百万的帖子,那么,这是一个好主意,或者它会崩溃我的网站,因为我需要刷新索引每次,我是新手请告诉我正确的方法为重搜索。instagram和其他社交网站使用什么搜索技术。