Страницы

Поиск по вопросам

суббота, 9 марта 2019 г.

Поиск по вхождению строки в django + haystack + Whoosh

Имеется некая модель. В ней хранятся названия фильмов. Вот класс индекса: 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'. Источник

Комментариев нет:

Отправить комментарий