Поиск по вхождению строки в django + haystack + Whoosh
📁 python, работа
Имеется некая модель. В ней хранятся названия фильмов. Вот класс индекса:
from haystack import indexesfrom kino.films.models import Filmsclass 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): retu FilmsИндекс создаётся и всё почти работает, но не совсем так как надо. Запрос вида
SearchQuerySet().filter(content='avatar')возвращает то, что нужно, а вида
SearchQuerySet().filter(content='avat')не возвращает ничего. Что я делаю не так?
Ничего. А точнее вы все делаете правильно. Сам на этом накололся, когда делал через хайстэк автокомплит в поиске. Whoosh просто ""полнотекстовый"" поиск с минимальной морфологией. Для поиска вхождений вам надо пользоваться классическим like'ом.
UPDATE Каюсь, я вас обманул. Решил все-таки нагуглить, чтобы не ударить в грязь лицом. И вот что нашлось. У хайстэка есть специальный метод autocomplete как раз для этого.
import datetimefrom haystack import indexesfrom myapp.models import Noteclass 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): retu Note def index_queryset(self): """"""Used when the entire index for model is updated."""""" retu Note.objects.filter(pub_date__lte=datetime.datetime.now())И собственно сам поиск
from haystack.query import SearchQuerySetSearchQuerySet().autocomplete(content_auto='old')# Result match things like 'goldfish', 'cuckold' & 'older'. Войдите чтобы оставить ответ