Поиск по нескольким полям - PullRequest
3 голосов
/ 29 апреля 2010

Я думаю, что неправильно понимаю 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()

Но когда я выполняю поиск, ищется только поле «имя пользователя»; «twitter_account» игнорируется. Когда я выбираю результаты поиска через dbshell, объекты содержат правильные значения «user» и «twitter_account», но на странице результатов отображается «no results»:

    {% 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 голосов
/ 30 апреля 2010

Полагаю, это потому, что в стоге сена поле документа используется для общих поисков, если только вы не определите конкретный поиск для других полей, таких как поле twitter_account.

из документации по стогу сена

Каждый SearchIndex требует наличия одно (и только одно) поле с документ = True. Это указывает на оба Стог сена и поисковая система о какое поле является основным для поиск внутри.

Попробуйте указать индекс следующим образом

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}}

теперь стог сена будет искать содержимое этого файла (куда вы можете добавить все, что вы хотите), если вы не укажете индексный фильтр.

...