我正在通过 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 毫秒)的性能略高,但随着数据库的增长,我不认为这是一个可行的解决方案。