2009-10-22 48 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是一個很好的組合。

相關問題