Django Haystack 对同一模型的多个字段进行索引

R4c*_*hi7 3 python django django-haystack

我正在尝试使用django-haystack. 我正在尝试实现用户搜索。我的用户模型是这样的:

class MyUser(AbstractBaseUser):
    username = models.CharField(max_length=255, unique=True)
    name = models.CharField(max_length=63, blank=True)
    email = models.EmailField(blank=True, unique=True)
    status = models.CharField(max_length=255, blank=True, null=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    joined = models.DateTimeField(auto_now_add=True, null=True)
Run Code Online (Sandbox Code Playgroud)

现在,我想搜索nameusername字段。我创建了以下内容search_indexes.py

class UserIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(document=True, model_attr='name')
    username = indexes.CharField(model_attr='username')

    def get_model(self):
        return MyUser

    def get_updated_field(self):
        return "joined"
Run Code Online (Sandbox Code Playgroud)

但是,当我执行搜索时,我只得到与该name字段匹配的结果。我在这里做错了什么?还有其他方法可以做到这一点吗?

提前致谢。

Mar*_* B. 5

django-haystack 的工作方式是,document=True字段内的数据用于一般搜索,任何其他字段用于单独过滤。因此,在您的情况下,搜索将仅使用该name字段。要解决此问题,您需要使用指定搜索中要使用的所有字段的模板。首先,使用:

\n\n
text = indexes.EdgeNgramField(document=True, use_template=True)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,您\xe2\x80\x99需要在名为的模板目录中创建一个新模板,search/indexes/myapp/myuser_text.txt并将以下内容放入其中:

\n\n
{{ object.username }}\n{{ object.name }}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅http://django-haystack.readthedocs.org/en/latest/tutorial.html#handling-data以获取完整参考

\n