哪些应用/解决方案最适合Django中基于模型的搜索?

时间:2009-10-22 03:59:44

标签: django search

我有一个Django应用程序,其中大部分搜索都是由外键驱动的。例如,假设Student,School,State和EducationalQualification是Django模型,用户将通过从学校,州,学位,文凭等列表中选择来指定搜索条件来搜索学生。也就是说,对学生的搜索基本上是回答问题“显示属于以下学校的学生,谁属于以下州,谁拥有以下学位/文凭”。

我的Django应用程序纯粹是数据库驱动的 - 没有文档或网页可供搜索。

在这种情况下,搜索Django模型主要是由模型具有的外键引导,哪些搜索应用/解决方案最合适?我看过的所有人都谈论全文搜索,我可能错了,但我认为这不适合我的情况。

编辑: - 我目前正在使用Peter Herndon的方法(http://www.slideshare.net/tpherndon/django-search-presentation)进行搜索。但预计这将是一个高流量的网站,我担心速度和性能。

5 个答案:

答案 0 :(得分:2)

如果您的djangoapp纯粹是数据库驱动程序,那么使用complex-lookups-with-q-objects进行搜索应用程序将非常实用,因为making-queries(良好实现)是一种在FK引导的数据库上查找数据的有效方法

答案 1 :(得分:1)

django-filter是一个允许用户过滤的可重用Django应用程序 queryset动态。

尝试一下:)

答案 2 :(得分:0)

如果您的流量很高,您是否考虑过在Solr / Haystack上进行搜索?

Haystack基于Solr(Lucene)设置搜索非常简单,您基本上不需要修改模型。

http://haystacksearch.org/

你甚至可以从Woosh(Haystack的非生产搜索引擎)开始,然后再添加Solr。

答案 3 :(得分:0)

如果你正在进行这样的特定字段搜索,那么高级查询就是答案。等到你真的遇到性能问题,然后再过分担心它们。获得大量流量是一个难以解决的问题,而不是处理大量流量。如果你确实需要扩展它,那么请记住硬件很便宜。只需获得配置良好的非常好的数据库服务器,并进行大量缓存。

您可以尝试使用像sphinx,haystack等工具,但这些工具旨在处理Google风格的搜索,而不是您正在讨论的特定查询。

答案 4 :(得分:0)

为澄清celopes answer,django-haystack的工作方式是允许你为每个模型定义一个渲染的“文档”。

所以说你有一些模特......

class Teacher(mdoels.Model):
    name = models.CharFiel(max_length=100)

class Course(models.Model):
    name = models.CharField(max_length=100)
    teacher = models.ForeignKey(Teacher)

class Student(models.Model):
    name = models.CharFiel(max_length=100)
    grade = models.IntegerField()
    classes = models.ManyToManyField(Course, related_name='students')

class Grade(models.Model):
    value = models.CharField(max_length=1)
    course = models.ForeignKey(Course)
    student = models.ForeignKey(Student, related_name='grades')

在haystack中,您可以定义一个模板来渲染课程......

{% comment %} In this context 'object' represents a Course model {% endcomment %}
<h1>{{ object.name }}</h1>
<h2>{{ object.teacher.name }}</h2>
<ul>
{% for student in object.students %}
    <li>{{ student.name }}</li>
{% endfor %}
</ul>

通过这种方式,您不仅可以定义代表每个课程模型的“文档”,而且还可以根据HTML标记指定信息的优先级(h1比h2更重要,这是比李更重要。

就开销而言,这些“文档”是使用haystack管理命令...

呈现的
\> manage.py reindex

通过这种方式,您可以按照您熟悉的间隔重新获取cron / Scheduler作业以重新索引。

Solr还包括一些简洁的东西,如拼写建议,以及所有那些整洁的东西。我最初尝试使用干草堆的飞快移动,但是它被指出它用包含连字符的queirest做有趣的事情。 Haystack + Solr是一个很好的组合。