Имеется некая модель. В ней хранятся названия фильмов. Вот класс индекса:
from haystack import indexes
from kino.films.models import Films
class FilmsIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
rusname = indexes.CharField(model_attr='rusname')
origname = indexes.CharField(model_attr='origname')
year = indexes.IntegerField(model_attr='year')
def get_model(self):
return Films
Индекс создаётся и всё почти работает, но не совсем так как надо. Запрос вида
SearchQuerySet().filter(content='avatar')
возвращает то, что нужно, а вида
SearchQuerySet().filter(content='avat')
не возвращает ничего. Что я делаю не так?
Ответ
Ничего. А точнее вы все делаете правильно. Сам на этом накололся, когда делал через хайстэк автокомплит в поиске.
Whoosh просто "полнотекстовый" поиск с минимальной морфологией. Для поиска вхождений вам надо пользоваться классическим like'ом.
UPDATE
Каюсь, я вас обманул. Решил все-таки нагуглить, чтобы не ударить в грязь лицом. И вот что нашлось.
У хайстэка есть специальный метод autocomplete как раз для этого.
import datetime
from haystack import indexes
from myapp.models import Note
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
author = indexes.CharField(model_attr='user')
pub_date = indexes.DateTimeField(model_attr='pub_date')
# We add this for autocomplete.
content_auto = indexes.EdgeNgramField(model_attr='content')
def get_model(self):
return Note
def index_queryset(self):
"""Used when the entire index for model is updated."""
return Note.objects.filter(pub_date__lte=datetime.datetime.now())
И собственно сам поиск
from haystack.query import SearchQuerySet
SearchQuerySet().autocomplete(content_auto='old')
# Result match things like 'goldfish', 'cuckold' & 'older'.
Источник
Комментариев нет:
Отправить комментарий