Страницы

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

среда, 22 января 2020 г.

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

#python #django


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

не возвращает ничего. Что я делаю не так?    


Ответы

Ответ 1



Ничего. А точнее вы все делаете правильно. Сам на этом накололся, когда делал через хайстэк автокомплит в поиске. 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'. Источник

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

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