搜索多个字段

sch*_*eck 3 python django django-haystack

我想我不会正确地解读django-haystack:

我有一个包含几个字段的数据模型,我想搜索其中两个:

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

我的搜索索引设置:

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()
Run Code Online (Sandbox Code Playgroud)

但是当我执行搜索时,只搜索字段"username"; "twitter_account"被忽略.当我通过dbshel​​l选择Searchresults时,对象包含"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 %}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

vin*_*ios 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')
Run Code Online (Sandbox Code Playgroud)

并创建一个名为search/indexes // userprofile_text.txt的文件

其中包含以下内容

{{ object.user.get_full_name }}
{{ object.twitter_account}}
Run Code Online (Sandbox Code Playgroud)

现在,当您没有指定索引过滤器时,haystack将搜索此文件的内容(您可以在其中添加任何内容).