跨多个字段搜索

3 投票
1 回答
3648 浏览
提问于 2025-04-15 22:08

我觉得我对django-haystack的理解还不够清楚:

我有一个数据模型,里面有几个字段,我想让其中两个字段可以被搜索:

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”这个字段却被忽略了。当我通过数据库命令行查看搜索结果时,里面的“user”和“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 %}

有什么想法吗?

1 个回答

9

我想这是因为 haystack 在进行一般搜索时会使用文档字段,除非你特别定义了其他字段的搜索,比如 twitter_account 字段。

来自 haystack 的文档

每个 SearchIndex 都需要有一个(且只能有一个)字段设置为 document=True。这告诉 Haystack 和搜索引擎,哪个字段是主要的搜索字段。

试着按照以下方式指定索引

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

然后创建一个名为

search/indexes//userprofile_text.txt

的文件,这个文件里会包含以下内容

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

现在,当你没有指定索引过滤器时,haystack 会在这个文件的内容中搜索(你可以在这里添加任何你想要的内容)。

撰写回答