Django Haystack/ElasticSearch 索引过程终止

4 投票
3 回答
1669 浏览
提问于 2025-04-17 13:42

我正在使用django 1.4、Haystack 2 beta和ElasticSearch .20进行设置。我的数据库是postgresql 9.1,里面有几百万条记录。当我尝试用haystack/elasticsearch对所有数据进行索引时,过程超时了,系统只给我发了个“Killed”的消息。到目前为止,我注意到了以下几点:

  1. 我确实能看到要索引的文档数量,所以并不是出现了“没有文档需要索引”的错误。
  2. 索引一小部分数据,比如1000条,是没问题的。
  3. 我尝试在haystack/backends/__init__.py里硬编码超时时间,但似乎没有任何效果。
  4. 我也尝试在elasticsearch.yml中更改选项,但也没用。

如果硬编码超时时间不管用,那我还有什么其他方法可以延长索引时间呢?有没有办法直接在ElasticSearch中更改这个?或者说有没有批处理的方法?

提前谢谢你们!

3 个回答

1

你有没有注意到,当你尝试处理所有那些记录时,你的程序消耗了多少内存?通常,当你看到“被杀死”这个提示时,意味着你的系统内存不够用了,这时候系统会启动一个叫做OOM杀手的东西,它会结束你的程序,以释放一些系统资源。

6

我觉得问题出在生成要发送给ElasticSearch的文档上,使用batch-size这个选项可能会对你有帮助。

update方法在ElasticSearch后端中,会从每个提供的查询集中准备要索引的文档,然后对这个查询集进行一次批量插入。

self.conn.bulk_index(self.index_name, 'modelresult', prepped_docs, id_field=ID)

所以,如果你有一个包含数百万条记录的表,运行update_index这个命令在那个被索引的模型上,就意味着你需要生成这数百万个文档,然后再进行索引。我觉得这就是问题所在。通过设置--batch-size选项来限制批量大小,可以控制生成的文档数量,避免一次性处理太多。

2

这个版本的haystack有一些问题。导致出错的代码在文件haystack/management/commands/update_index.py中的这一行:

pks_seen = set([smart_str(pk) for pk in qs.values_list('pk', flat=True)])

这行代码让服务器的内存用完了。不过,在进行索引时,这行代码似乎并不是必需的。所以,我把它改成了:

pks_seen = set([])

现在它可以顺利处理批量数据了。感谢所有回答的人!

撰写回答