2009-09-27 101 views
1

我使用Djapian通過關鍵字搜索對象,但我希望能夠過濾結果。這將是不錯的使用Django的查詢集API對於這一點,例如:Djapian - 過濾結果

if query.strip(): 
    results = Model.indexer.search(query).prefetch() 
else: 
    results = Model.objects.all() 
results = results.filter(somefield__lt=somevalue) 
return results 

但Djapian返回HitResultSet對象,而不是Model對象。我當然可以用Python「手動」過濾對象,但是在過濾所有對象(查詢爲空)的情況下不太現實 - 我必須從數據庫中檢索整個表。

我是否因爲使用Djapian而失敗?

回答

4

我經歷了它的源代碼,發現Djapian有一個可應用於其結果的過濾方法。我剛剛嘗試了下面的代碼,它似乎在工作。

我的索引如下:

class MarketIndexer(djapian.Indexer): 

    fields = [ 'name', 'description', 'tags_string', 'state'] 
    tags = [('state', 'state'),] 

這是我如何篩選結果(沒關係,做的東西通配符使用的第一行):

objects = model.indexer.search(q_wc).flags(djapian.resultset.xapian.QueryParser.FLAG_WILDCARD).prefetch() 
objects = objects.filter(state=1) 

執行時,它現在使Market s的狀態等於「1」。

0

我不知道Djapian,但我熟悉xapian。在Xapian中,您可以使用MatchDecider篩選結果。

匹配判定器的判定函數在每個匹配搜索條件的文檔上被調用,因此對這裏的每個文檔執行數據庫查詢並不是一個好主意,但是您當然可以訪問文檔的值。

例如在ubuntuusers.de我們有一個xapian數據庫,其中包含博客文章,論壇帖子,行星條目,維基條目等,並且xapian數據庫中的每個文檔都有一些額外的訪問信息存儲爲值。查詢後,AuthMatchDecider過濾潛在的文檔並返回過濾後的MSet,然後將其顯示給用戶。

如果決策過程是somefield < someValue中一樣簡單,你也可以簡單地somefield的值添加到文件(使用Xapian的提供的sortable_serialize功能)的值,並添加(使用OP_FILTER)的OP_VALUE_RANGE查詢原始查詢。