我有一个Django应用程序,其中大部分搜索都是由外键驱动的。例如,假设Student,School,State和EducationalQualification是Django模型,用户将通过从学校,州,学位,文凭等列表中选择来指定搜索条件来搜索学生。也就是说,对学生的搜索基本上是回答问题“显示属于以下学校的学生,谁属于以下州,谁拥有以下学位/文凭”。
我的Django应用程序纯粹是数据库驱动的 - 没有文档或网页可供搜索。
在这种情况下,搜索Django模型主要是由模型具有的外键引导,哪些搜索应用/解决方案最合适?我看过的所有人都谈论全文搜索,我可能错了,但我认为这不适合我的情况。
编辑: - 我目前正在使用Peter Herndon的方法(http://www.slideshare.net/tpherndon/django-search-presentation)进行搜索。但预计这将是一个高流量的网站,我担心速度和性能。
答案 0 :(得分:2)
如果您的djangoapp纯粹是数据库驱动程序,那么使用complex-lookups-with-q-objects进行搜索应用程序将非常实用,因为making-queries(良好实现)是一种在FK引导的数据库上查找数据的有效方法
答案 1 :(得分:1)
django-filter是一个允许用户过滤的可重用Django应用程序 queryset动态。
尝试一下:)
答案 2 :(得分:0)
如果您的流量很高,您是否考虑过在Solr / Haystack上进行搜索?
Haystack基于Solr(Lucene)设置搜索非常简单,您基本上不需要修改模型。
你甚至可以从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是一个很好的组合。