Точная фильтрация Django Haystack

У меня есть поиск в стоге сена, который имеет следующий SearchIndex:

class GrantIndex(indexes.SearchIndex):
    """
    This provides the search index for the Grant application.
    """
    text = indexes.CharField(document=True, use_template=True)
    year = indexes.IntegerField(model_attr='year__year')
    date = indexes.DateField(model_attr='date')
    program = indexes.CharField(model_attr='program__area')
    grantee = indexes.CharField(model_attr='grantee')
    amount = indexes.IntegerField(model_attr='amount')
site.register(Grant, GrantIndex)

Если я хочу выполнить поиск, отфильтровав любые программы, НЕ ЯВЛЯЮЩИЕСЯ «Здоровьем», я запускаю следующий запрос:

from haystack.query import SearchQuerySet

sqs = SearchQuerySet()
sqs = sqs.filter(program='Health')

К сожалению, при этом также создаются объекты из программы "Здоровье\Другое" и "Здоровье\Сердечно-сосудистые заболевания". Как мне запретить поиску допускать эти другие программы?

Я запускаю Ubuntu 9.10 с Xapian в качестве своего поискового сервера.


person damon    schedule 28.01.2010    source источник


Ответы (5)


Возможно, вы уже решили проблему, но я только что наткнулся на ту же проблему с бэкэндом Whoosh. Может быть, бэкенды Xapian и Whoosh ведут себя одинаково? Кажется, Whoosh по умолчанию блокирует все поля CharField и выполняет поиск внутри них с помощью какого-то содержимого-запроса. Переключение на настраиваемый бэкенд без включения стеминга в CharFields устранило эту проблему для меня.

Надеюсь, это подтолкнет кого-то еще в правильном направлении.

person Emil Stenström    schedule 07.06.2010

вы можете использовать поиск по полям, как описано здесь.

sqs = sqs.filter(program__exact='Health')
person Dmitry Shevchenko    schedule 28.01.2010
comment
filter(program=Health) и filter(program__exact=Health) согласно документации и на практике совпадают. - person damon; 29.01.2010

используйте "prepare_data" для поля программы и избавьтесь от вещей здоровья\блабла

person soField    schedule 03.12.2011

Для серверной части solr мне нужно использовать _exact (только одно подчеркивание вместо двух).

person ambi    schedule 20.08.2013

Отказ от ответственности: я сопровождаю Xapian-Haystack.

Я полагаю, что это происходит потому, что Xapian-Haystack использовал генератор терминов, который экранировал специальные символы, такие как /.

Итак, в вашем случае "Health\Other" индексировалось как "health" и "other". Недавно это было исправлено в главной ветке Xapian-Haystack, см., например. здесь.

person Jorge Leitao    schedule 23.05.2014