2009-10-22 50 views
3

我有一个Django应用程序,其中大部分搜索都是由外键驱动的。例如,假设学生,学校,州和教育质量是Django模型,用户将通过从学校,州,学位,文凭等列表中选择指定搜索标准来搜索学生。也就是说,搜索学生本质上是回答“显示属于下列学校,属于下列州,并且具有以下学位/文凭的学生”的问题。哪些应用程序/解决方案最适合在Django中进行基于模型的搜索?

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

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

编辑: - 我目前正在寻找使用彼得赫恩登的方法(http://www.slideshare.net/tpherndon/django-search-presentation)。但预计这是一个高流量的网站,我担心速度和性能。

回答

2

如果您的djangoapp纯粹是数据库驱动程序,将会对complex-lookups-with-q-objects执行搜索应用程序很实用,因为making-queries(很好实现)是查找FK指导的db数据的有效方法。

+0

这正是我现在正在做的。另一方面,我担心,因为这将是一个高流量的网站。 – chefsmart 2009-10-22 04:29:34

0

如果您打算拥有高流量,您是否考虑过在Solr/Haystack上进行搜索?

Haystack使建立基于Solr(Lucene)的搜索非常简单,你基本上不必修改你的模型。

http://haystacksearch.org/

你甚至可以开始与Woosh(用于草堆非生产的搜索引擎),再后来就Solr的补充。

+0

Lucene和Solr似乎都专注于全文搜索。我不确定这是我需要的,但我一直在阅读文档以了解这是如何适合我的情况的。 – chefsmart 2009-10-22 16:25:31

1

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

试试吧:)

+1

我会第二个Django过滤器,当然我也是作者:) – 2009-11-03 04:47:37

+0

+1好控制;) – panchicore 2009-11-03 16:25:36

0

如果你正在做这样的特定领域的搜索,这似乎你是,那么先进的查询是答案。等到你真的有性能问题,然后再担心太多。与处理大量流量相比,获得大量流量是一个更难解决的问题。如果你确实需要扩展它,那么记住硬件便宜。只需要一个配置好的非常好的数据库服务器,并且拥有大量的缓存。

您可以尝试使用sphinx,干草堆等工具,但这些工具旨在处理Google风格的搜索,而不是您正在讨论的真正具体的查询。

+0

“获得大量的流量是一个更难的问题”,但流量已经存在,因为这是一个应用程序将由全国教育工作者和公司联盟使用。现在我坚持使用Q对象。 – chefsmart 2009-11-06 05:42:38

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') 

在草堆里,你会定义一个模板呈现课程...

{% 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)。

在使用草堆管理命令呈现开销这些“证件”的方面...

\> manage.py reindex 

通过这种方式,你可以seutp一个cron /调度工作,在你熟悉的任何间隔时间,以重新编制。

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

相关问题