@Antoine

Как сортировать по icontains?

Есть таблица, по которой, по некотором полям ведется поиск через fieldname__icontains. Вопрос - как отсортировать результирующий queryset по "близости" вхождения? Например, есть записи (набор записей не реальный, просто чтобы было понятно):
котел
котлета
коты
котировка
икота
кот

При поисковом запросе "кот" - первым в queryset'e был "кот", потому что совпадение полное, потом "коты", потому что после вхождения слова "кот" - всего одна буква следующая, потом - в произвольном порядке - "котел, котлета, котировка" - потому что после "кот" уже много букв, но слова начинаются с "кот", а уже потом, в конце - "икота", потому что она содержит искомую строку уже внутри слова.
Такое вообще реально сделать самому? Или это уже надо использовать всякие поисковые движки, типа elastic, sphinx?
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
@deliro
У постгреса есть поиск по триграммам, у триграмм есть similarity (по которой можно сортировать и фильтровать). В джанге (кажется, начиная с 1.10) есть привязки для этого всего — https://docs.djangoproject.com/en/2.0/ref/contrib/...

Нужно в БД установить pg_trgm; (которое тоже есть в джанге, но для этого юзер БД джанги должен быть суперюзером)
Можно сделать GiN индекс по триграмме, что ускорит выполнение __icontains.

Пример поиска можно посмотреть здесь: https://ukar.su/
Делал ребятам поиск как раз на триграммах. Но там он чуть умнее — умеет понимать ошибочную раскладку. Можешь поискать, например, "Thermaflex". Вводишь Thermaflix, thermoflex, еукьщадулы, термафлекс, термосфрекс, nthvjaktrc, флекстермо — всё равно находит
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы