2010-04-28 231 views
3

我以爲我不unterstand Django的乾草堆正確:搜索在多個領域

我有一個包含幾個字段的數據模型,我也有他們兩個搜索:

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True, default=None) 
    twitter_account = models.CharField(max_length=50, blank=False) 

我搜索索引設置:

class UserProfileIndex(SearchIndex): 
    text = CharField(document=True, model_attr='user') 
    twitter_account = CharField(model_attr='twitter_account') 

    def get_queryset(self): 
     """Used when the entire index for model is updated.""" 
     return UserProfile.objects.all() 

但是,當我執行搜索時,只搜索「username」字段; 「twitter_account」被忽略。當我通過dbshel​​l選擇SearchResult所,對象包含「用戶」和「twitter_account」正確的價值觀,但結果頁面顯示「無結果」:

{% if query %} 
     <h3>Results</h3> 

     {% for result in page.object_list %} 
      <p> 
       <a href="{{ result.object.get_absolute_url }}">{{ result.object.id }}</a> 
      </p> 
     {% empty %} 
      <p>No results</p> 
     {% endfor %} 
    {% endif %} 

任何想法?

回答

9

我想這是因爲haystack使用文檔字段進行一般搜索,除非您爲twitter_account字段等其他字段定義特定的搜索。

from haystack documentation

每SearchIndex要求會有 一個(並且只有一個)與 文檔字段=真。這表明對於 Haystack和搜索引擎 哪個字段是 在其中搜索的主要字段。

嘗試specifing指標如下

class UserProfileIndex(SearchIndex): 
    text = CharField(document=True, use_template=True) 
    user = CharField(model_attr='user') 
    twitter_account = CharField(model_attr='twitter_account') 

,並創建命名一個文件 搜索/索引// userprofile_text.txt

其中將包含以下

{{ object.user.get_full_name }} 
{{ object.twitter_account}} 

現在乾草堆會在這個文件的內容中搜索(你可以在哪裏添加你想要的)您不指定索引過濾器。

+0

完美的作品,非常感謝。 – schneck 2010-04-30 13:51:57