2013-08-14 3 views
0

Я использую Django Haystack для поиска.Django Haystack - Индексирование одного поля

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

Например: поиск хуга дает результаты, где хуг находится в bio поле.

Этого не должно быть, я хочу только вернуть результаты, где xyz находится в поле title. Полное игнорирование всех других полей, кроме Artist.title для поиска по.

artists/models.py:

class Artist(models.Model): 
    title = models.CharField(max_length=255) 
    slug = models.SlugField(max_length=100) 
    strapline = models.CharField(max_length=255) 
    image = models.ImageField(upload_to=get_file_path, storage=s3, max_length=500) 
    bio = models.TextField() 

artists/search_indexes.py

from haystack import indexes 
from app.artists.models import Artist 

class ArtistIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True, model_attr='title') 

    def get_model(self): 
     return Artist 

Я думаю, думать о нем, как SQL запроса:

SELECT * FROM artists WHERE title LIKE '%{search_term}%' 

UPDATE

По предложению удалить use_template = True, мой search_indexes.py теперь выглядит следующим образом:

from haystack import indexes 
from app.artists.models import Artist 


class ArtistIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, model_attr='title') 
    title = indexes.CharField(model_attr='title') 

    def get_model(self): 
     return Artist 

Но я с той же проблемой. (Пытался питон manage.py rebuild_index)

Это мои настройки Haystack, если это делает никакой разницы:

HAYSTACK_CONNECTIONS = { 
    'default': { 
     'ENGINE': 'haystack.backends.simple_backend.SimpleEngine', 
    }, 
} 

ответ

0

От Docs

Кроме того, мы обеспечиваем use_template=True на текстовом поле. Это позволяет нам использовать шаблон данных (а не конкатенацию с ошибками) для создания документа, который поисковая система будет использовать при поиске. Вам нужно создать новый шаблон внутри каталога шаблона под названием search/indexes/myapp/note_text.txt и поместите следующие внутри:

{{ object.title }} 
{{ object.user.get_full_name }} 
{{ object.body }} 

Так что я думаю, в этом шаблоне вы можете объявить, какие поля должны быть проиндексированы/Поиск по

Другие путь - переопределить класс def prepare(self, object) класса Index и явно определить поля, которые необходимо индексировать/искать. ИЛИ просто использовать model_attr

+0

Спасибо, я добавил обновление к моему вопросу, так как это, похоже, не разрешило мою проблему. – kieran

3

model_attr и use_template не работают вместе. В этом случае, поскольку вы запрашиваете один атрибут модели, нет необходимости использовать шаблон. Шаблоны в индексах поиска предназначены исключительно для группировки данных.

Таким образом, вы в конечном итоге с:

class ArtistIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, model_attr='title') 

    def get_model(self): 
     return Artist 
+0

Спасибо, я добавил обновление к моему вопросу, так как это, похоже, не разрешило мою проблему. – kieran

1

Если у вас нет какой-либо другой случай использования для вашего индекса (то есть запросы, которые должны соответствуют условия в другом месте), вы просто должны не use_template вообще (набор параметр use_template до False и просто отсканируйте шаблон поиска), и все будет готово. FWIW отметим, что при прохождении True для use_template параметр model_attr игнорируется. Кроме того, у вас может не быть пользы для полнотекстовой поисковой системы, тогда вы могли бы просто использовать стандартный API поиска QuerySet Django, то есть Artist.objects.filter(title__icontains=searchterm).

остальное - если вы по-прежнему нужен «полный» индекс документа для других запросов и только хотите ограничить это один поиск в title вы также можете добавить еще один index.CharFielddocument=False, model_attr='title') для названия и поиск только по этому полю , Как это сделать, полностью задокументировано в документе API SearchQuerySet для Haystack.

+0

Спасибо, я добавил обновление к моему вопросу, так как это, похоже, не разрешило мою проблему. – kieran

+0

@kieran: вам нужно перестроить весь свой индекс каждый раз, когда вы меняете определения индекса. Кроме того, вы прочитали большое красное предупреждение о бэкэнде SimpleEngine? https://django-haystack.readthedocs.org/en/latest/tutorial.html#simple –

+0

yep делал это. Это будет перемещено в Solr, когда оно будет готово к производству. – kieran

0

В основном ваш search_indexes.py файл написан неверно. Он должен быть следующим: -

from haystack import indexes 
from app.artists.models import Artist 

class ArtistIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    title= indexes.CharField(model_attr='title',null=True) 

def get_model(self): 
    return Artist 

def index_queryset(self, using=None): 
    return self.get_model().objects.all() 

Тогда вам нужно создать шаблон в своем приложении. Структура каталогов будет, как:

шаблоны/поиск/указатели/художники/artist_text.txt

и добавьте следующий код в файл artist_text.txt:

{{ object.title }} 

сейчас do python manage.py rebuild_index.

Теперь он вернет результат только для названия.