Как имплементировать поиск на сайте?

Какие есть варианты и способы имплементации поиска на сайте?
На фронте используется Vue. На бекенде API сервер на Node, возвращающий JSON, БД Mongo (плюс докину Redis, если надо).
Просмотрел страниц 30 в поиске Гитхаба и не нашел ничего подходящего, либо я смотрю что-то не то.

Требования начальные примерно такие:
1. Self-hosted Open Source решение. Т.е. никаких облачных сервисов.
2. Подойдет простой поиск для начала, например по заголовкам статей. Т.е. юзер печатает слово, я его ищу во всех заголовках всех статей что есть в БД и возвращаю ему совпадения.
3. Если есть какие-то готовые проверенные модули, то автокомплит обязателен.
4. На фронте это должно выглядеть так: юзер печатает слово, и когда напечатал уже, скажем символов 5, то я ему возращаю в всплывающем под полем поиска сообщении варианты.

Я так полагаю мне надо решение и для бекенда и для фронта?
Какой вообще принцип имплементации подобного?

Также дополнительные вопросы:
1. Я правильно понял, Algolia это полностью облачное решение? Какой там принцип работы, если у меня все хранится в моей БД? Мне надо туда все переносить и зависить от них полностью? Что тогда делает эта библа? https://github.com/algolia/instantsearch.js Судя по тому что тредует API ключ, то данные она берет именно из облака Algolia?
2. Elasticsearch это вообще из другой оперы, только для логов? Или же нет? Какие конкретно задачи он выполняет в данном контексте и чем может пригодится?
3. Если пойти простым путем и начать разбираться с typeahead.js, то что там надо имплементировать на бекенде? Судя по их примеру на twitter.github.io/typeahead.js там при вводе идет запрос на /search?q=hello и возвращается JSON с 20 объектами. Выходит мне надо сделать контроллер на сервере, который будет просто делать постоянно запросы в БД? Или просто держать где-то в памяти абсолютно всю нужную информацию (заголовки и контент статей, например) и выполнять поиск по всему тексту JSом и возвращать совпадения? Как это делается правильно?

В ходе ресерча на Гитхабе было найдено это.

https://github.com/algolia/instantsearch.js // только с Algolia???
https://github.com/algolia/vue-instantsearch // только с Algolia???

Frontend, Autocomplete:
https://github.com/twitter/typeahead.js // в идеале так должно работать
https://github.com/LeaVerou/awesomplete // это похоже работает когда все данные уже на клиенте?
https://github.com/bevacqua/horsey
https://github.com/algolia/autocomplete.js// опять Algolia. это работает только с ними?
https://github.com/santiblanko/vue-instant

Fuzzy Search:
https://github.com/krisk/Fuse
https://github.com/farzher/fuzzysort
https://github.com/mattyork/fuzzy
https://github.com/bevacqua/fuzzysearch

Backend:
https://github.com/tj/reds // это мимо, или для моей задачи?
  • Вопрос задан
  • 922 просмотра
Решения вопроса 1
@Zuzik3500
Любитель...
1) Берете либо делаете автокомплит компонент. Делается просто, временами проще сделать, чем настраивать под себя, что то существующее. Делается реально просто.
2) Автокомплит компонент при вводе определенного количества символов отправляет запрос на сервер. Если символы допечатали - предыдущий отправленный запрос прерывается (debounce называется такая фигня).
3) Сервер в ответ на фразу делает запрос в базу и вытаскивает данные. Как вытаскивает - упомянутый вами fuzzy search (чаще всего основан на расстоянии левенштейна), полное / частичное совпадение, другой вариант который будет ставить в соответствие фразу и определенные записи из бд. ElasticSearch - если я не ошибаюсь для тех вариантов, когда нужен поиск по тексту статьи. В ответ шлется наименование статьи и идентификатор статьи либо вся статья. Вся статья либо идентификатор - по желанию, в зависимости от размера статей.
4) После того как пришел ответ с сервера - vuejs при выборе из списка автокомплита отображает статью либо подгружает ее по идентификатору, либо что то еще аналогичное.

Все просто и легко и пишется самостоятельно. Как то был потрачен день на поиск готовых вариантов, в результате чего было найдено что то относительно неплохое, весящее много, "прицепленное к текущему проекту изолентой". Потом - за полдня был написан свой вариант который и работал быстрее и весил меньше и настраивался легко под текущие задачи.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
Посмотрите здесь. Мы использовали RiSearch Pro, отлично работает, мои рекомендации.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы