Заготовка/Драфт под мантикору в качестве поиска #1215
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Продолжу работу к следующим выходным, чтобы не забыть, закину в драфт что уже есть и что надо сделать.
Зачем вастрик.клубу мантикора?
По сути 2 больших плюса. Первый -- это современный поисковой движок, который имеет морфологию из коробки, стоп-слова, словоформы, а так же богатый язык синтаксиса запроса. Можно проедоставить пользователю с одной стороны качественный поиск as-is, с другой стороны, продвинутые пользователи могут иметь крутой синтаксис. Типа
@title hello !world
будет искать только те посты, где в титле есть "hello" и точно нет "world".Второй большой плюс -- более быстрая индексация и меньший размер индексов. Залил в локальную сборку 4106 постов. Старый ребилд индекс занимает 1 минуту 17 секунд:
$ time python3 manage.py rebuild_search_index ... Done 🥙 Comments: 0 Posts: 4106 Users: 1623 real 1m17.925s user 0m11.768s sys 0m1.091s
при этом индекс весит 177Мб
Тогда как индексация мантикоры занимает 10 секунд
time python3 manage.py rebuild_manticore_index real 0m10.362s user 0m4.978s sys 0m1.157s
и индекс после рестарта занимает 56Мб
т.е. имея эти данные на руках, получается, что мантикора даст на индексирование в 8 раз быстрее, будет занимать в 3 раза меньше места на диске + даст нам адекватный поиск с морфологией, крутым синтаксисом и прочими плюшками современных fulltext движков.
Дальнейшие шаги
Если мы размещаем в мантикоре только fulltext поля, типа title/text, то с одной стороны мы сокращаем индекс мантикоры, но с другой стороны, на выходе мы будем получать массив id и надо будет лезть в основную базу, чтобы построить отображение найденных постов/комментов. учитывая пагинацию и точечные запросы, это не большая проблема. Другая большая проблема -- мы теряем возоможность сложных запросов, типа "все посты с поминанием laravel, но чтобы рейтинг от 100 и комментов было минимум 20". Так же большим плюсом размещение доп. данных и параметров постов/комментов в мантикоре будет возможность индексирования всех данных, необходимых для рендера поиска, т.е. не надо будет обращаться к основной базе. Но в таком случае нужно будет обновлять индекс мантикоры после каждого лайка/коммента к посту. Что не сильно напряжно, но неприятно.
Я бы оставил полную индексацию всех параметров на вторую итерацию, начать можно просто с того, что сделаем морфологию и адекватный поиск. А там уже, если зайдёт, можно и остальные фишки подтянуть
replace
единый метод, который поpost_id
филду будет либо инсертить новые данные, либо обновлять старые. Прокинуть вsave
методы комментов, постов и пользователей ручки для создания/редактирования мантикор-индекса.upvotes
постов/комментов./search2
для тестов, вылить в прод, понаблюдать в shadow режимеНавеяно ишьями:
#1213
#1206
#1191
#1052
не все явно про качество поиска, но как-будто проблема в поиске есть, а мы же типа айтишники, негоже