2010-04-28 198 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