使用 Solr、Django-Haystack 和标准 Django 过滤器查询时的性能问题

问题描述 投票:0回答:0

我正在通过 Django-Haystack 与 Solr 合作,通过文本搜索大型数据表来改进基本的 Django 查询集。我的主数据库是 postgresql。我有大约 300 万行

Record
对象和 1300 万行
Info
对象。这些都会随着时间的推移而增长,所以我使用 Solr 来索引描述字段。

当我尝试在 Django 中使用 Solr 结果时,我遇到了严重的性能问题。

以下是模型(缩写):

class Record:
  name = models.CharField()

class Info:
  record = models.ForeignKey(Record...)
  description = models.CharField()

我从所有记录的查询集开始。目标是使用文本查询对信息模型中的描述进行过滤。

queryset = Record.objects.all()

当我使用 Django-Haystack 查询 Solr 时,我可以获得与查询字符串匹配的信息对象 pk 列表:

sqset = SearchQuerySet().filter(text=query_string).values_list('pk', flat=True)

sqset
的长度可以是 500 多个项目。因此,当我尝试在 Django 中使用
__in
在标准查询中使用它时,我最终执行了一个包含数百个
ORs
:

的大量 SQL 查询
queryset = queryset.filter(info__id__in=sqset)

Django 调试工具栏告诉我 SQL 是高性能的(平均大约 60 毫秒)。查询的 Solr 部分也几乎立即完成。但如果 sqset 的长度约为 500 项,则总查询可能需要超过 7000 毫秒才能完成,这并不少见。似乎有很多开销使查询陷入困境。

请告诉我如何在这种情况下高效地使用 Solr。基本的 Django

icontains
查找比我上面描述的(在相同搜索条件下大约 6000 毫秒)的性能略高,但随着数据库的增长,我不认为这是一个可行的解决方案。

python django postgresql solr django-haystack
© www.soinside.com 2019 - 2024. All rights reserved.