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

Енот
Новичо́к, через «о́»
Регистрация
13 Янв 2018
Сообщения
536
#1
Когда будет реализован умный поиск? очень нужно)
 
Регистрация
15 Дек 2017
Сообщения
5,067
#2
Енот
Новичо́к, через «о́»
Регистрация
13 Янв 2018
Сообщения
536
#3
По ключевому слову Autocomplete JS масса решений, берите любое и добавляйте в шаблон.
URL для получения списка фильмов поиска - /search/title?json=1&q=Игра - DEMO
Было бы неплохо если выложите краткий мануал как реализовать умный поиск, куда какой код вставить как подключить js, ну что то в этом роде, в поиске нашел это https://ruseller.com/lessons.php?rub=37&id=2729 , но не совсем понятно
 
Регистрация
15 Дек 2017
Сообщения
5,067
#4
Было бы неплохо если выложите краткий мануал как реализовать умный поиск, куда какой код вставить как подключить js, ну что то в этом роде, в поиске нашел это https://ruseller.com/lessons.php?rub=37&id=2729 , но не совсем понятно
При беглом просмотре, да, подойдет и этот способ. Серверная чать уже есть, осталось подогнать под данные.
/query?q=%QUERY% -> /search/title?json=1&q=%QUERY%
Массив с фильмами находится в movies.

mm.png
 
Енот
Новичо́к, через «о́»
Регистрация
13 Янв 2018
Сообщения
536
#5
При беглом просмотре, да, подойдет и этот способ. Серверная чать уже есть, осталось подогнать под данные.
/query?q=%QUERY% -> /search/title?json=1&q=%QUERY%
Массив с фильмами находится в movies.

Посмотреть вложение 312
все равно не получается, вот если бы вы описали все действия пошагово было бы хорошо, да и чтобы поиск осуществлялся по актерам
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#6
При беглом просмотре, да, подойдет и этот способ. Серверная чать уже есть, осталось подогнать под данные.
/query?q=%QUERY% -> /search/title?json=1&q=%QUERY%
Массив с фильмами находится в movies.

Посмотреть вложение 312
пытаюсь сделать по такой системе https://ruseller.com/lessons.php?rub=37&id=2729

по сути выдает,но все данные выдает, ид, название, описание и тд

show1.png


А при выборе из ответов, получаем это

show2.png
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#7
Регистрация
15 Дек 2017
Сообщения
5,067
#8
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#9
У них return '<a href="' + data.profile.username + '" class="list-group-item">' + data.name + ' - @' + data.profile.username + '</a>'
У Вас return '<a href="' + data.url + '" class="list-group-item">' + data.title + '</a>'
пробовал, но выводится так

show3.png
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#13

App

Регистрация
26 Дек 2017
Сообщения
379
#17
попытаться на этом реализовать https://github.com/devbridge/jQuery-Autocomplete

HTML:
<input type="text" name="country" id="autocomplete"/>
JavaScript:
$('#autocomplete').autocomplete({
    serviceUrl: '/search/title',
    paramName: 'q',
    transformResult: function(response) {
        return {
            suggestions: $.map(response.movies, function(movie) {
                return {
                    title: movie.title,
                    url: movie.url
                };
            })
        };
    }
    onSelect: function(suggestion) {
        alert('You selected: ' + suggestion.url + ', ' + suggestion.title);
    }
});
HTML:
<div class="autocomplete-suggestions">
    <div class="autocomplete-group"><strong></strong></div>
    <div class="autocomplete-suggestion autocomplete-selected">...</div>
    <div class="autocomplete-suggestion">...</div>
    <div class="autocomplete-suggestion">...</div>
</div>
CSS:
.autocomplete-suggestions { border: 1px solid #999; background: #FFF; overflow: auto; }
.autocomplete-suggestion { padding: 2px 5px; white-space: nowrap; overflow: hidden; }
.autocomplete-selected { background: #F0F0F0; }
.autocomplete-suggestions strong { font-weight: normal; color: #3399FF; }
.autocomplete-group { padding: 2px 5px; }
.autocomplete-group strong { display: block; border-bottom: 1px solid #000; }
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#18
тут все правильно, у вас на скрине (https://enota.club/attachments/mm-png.312/) я вижу, что выводится movies > 0 > а потом уже и данные о фильмах как и на скрине у меня в консоле

4.png
 
Енот
Новичо́к, через «о́»
Регистрация
16 Сен 2018
Сообщения
108
#19
тут все правильно, у вас на скрине (https://enota.club/attachments/mm-png.312/) я вижу, что выводится movies > 0 > а потом уже и данные о фильмах как и на скрине у меня в консоле http://prntscr.com/ldyos8
Всё правильно работает.
Обработать массив нужно.

return data.map(function(movie){return '<a href="' + movie.url + '">' + movie.title + '</a>';}).join('')
 
Енот
Новичо́к, через «о́»
Регистрация
16 Сен 2018
Сообщения
108
#22
Парни объясните как на сайте реализовать поиск фильм. При вводе ключевого слова нет результата
Парни объясните как на сайте реализовать поиск фильм. При вводе ключевого слова нет результата
Сделать обновление по SSH.
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#27
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#31
Выводит только первый результат как сделать, чтобы хотя бы 5 выводило?
 
Енот
Новичо́к, через «о́»
Регистрация
8 Сен 2018
Сообщения
142
#35
попытаться на этом реализовать https://github.com/devbridge/jQuery-Autocomplete

HTML:
<input type="text" name="country" id="autocomplete"/>
JavaScript:
$('#autocomplete').autocomplete({
    serviceUrl: '/search/title',
    paramName: 'q',
    transformResult: function(response) {
        return {
            suggestions: $.map(response.movies, function(movie) {
                return {
                    title: movie.title,
                    url: movie.url
                };
            })
        };
    }
    onSelect: function(suggestion) {
        alert('You selected: ' + suggestion.url + ', ' + suggestion.title);
    }
});
HTML:
<div class="autocomplete-suggestions">
    <div class="autocomplete-group"><strong></strong></div>
    <div class="autocomplete-suggestion autocomplete-selected">...</div>
    <div class="autocomplete-suggestion">...</div>
    <div class="autocomplete-suggestion">...</div>
</div>
CSS:
.autocomplete-suggestions { border: 1px solid #999; background: #FFF; overflow: auto; }
.autocomplete-suggestion { padding: 2px 5px; white-space: nowrap; overflow: hidden; }
.autocomplete-selected { background: #F0F0F0; }
.autocomplete-suggestions strong { font-weight: normal; color: #3399FF; }
.autocomplete-group { padding: 2px 5px; }
.autocomplete-group strong { display: block; border-bottom: 1px solid #000; }
Сделал по вашему способу. Заметил что при введении в поиск буквы, например "м" выводит нужные фильмы и фильмы без "м" в названии.
 
Енот
Новичо́к, через «о́»
Регистрация
8 Сен 2018
Сообщения
142
#37
В общем, сделал фильтр (чтоб не выводило не подходящие тайтлы) Стандартно: po defoltu.png. Сделал: vivodit.png. Есть такая проблема, когда пишешь слово не полностью, он не показывает фильмы, например написав "мс": ne vivodit.png. Потому, что поиск сам не находит: potomu chto.png и неоткуда брать их для поля. А по одной букве работает чётко, нашел такую же проблему на сайте у пользователя 7kadrtv. У него нет фильтра, так же не подходящие фильмы выводит: u 7kadr.png. Можно как-нибудь это исправить?
 

Вложения

Регистрация
15 Дек 2017
Сообщения
5,067
#38
В общем, сделал фильтр (чтоб не выводило не подходящие тайтлы) Стандартно: po defoltu.png. Сделал: vivodit.png. Есть такая проблема, когда пишешь слово не полностью, он не показывает фильмы, например написав "мс": ne vivodit.png. Потому, что поиск сам не находит: potomu chto.png и неоткуда брать их для поля. А по одной букве работает чётко, нашел такую же проблему на сайте у пользователя 7kadrtv. У него нет фильтра, так же не подходящие фильмы выводит: u 7kadr.png. Можно как-нибудь это исправить?
Система может исправить опечатку или склонение мститель, мстителям, ... но по запросу мс, мст, мсти, ... результата нет. Нужно смотреть как формируется запрос.
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#39
Покажите что в console.log(engine.ttAdapter());
http://prntscr.com/lf71dh

а так http://prntscr.com/lf71z5 при таком запросе
JavaScript:
suggestion: function getData(data) {
                    return data.map(function(movie){return '<a href="' + movie.url + '" style="font-weight: 100;">' + movie.title + ' <span style="color: #636363;font-weight: 100;">(' + movie.title_en + ') ' + movie.year +  '</span></a>' + console.log(movie.title)}).join()
      }
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#40
В общем, сделал фильтр (чтоб не выводило не подходящие тайтлы) Стандартно: po defoltu.png. Сделал: vivodit.png. Есть такая проблема, когда пишешь слово не полностью, он не показывает фильмы, например написав "мс": ne vivodit.png. Потому, что поиск сам не находит: potomu chto.png и неоткуда брать их для поля. А по одной букве работает чётко, нашел такую же проблему на сайте у пользователя 7kadrtv. У него нет фильтра, так же не подходящие фильмы выводит: u 7kadr.png. Можно как-нибудь это исправить?
помогите с фильтром
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#41
или хотя бы пример какой-нибудь
 
Енот
Новичо́к, через «о́»
Регистрация
13 Янв 2018
Сообщения
536
#42
Да может наши разработчики уже добавят данную фишку (живой поиск) в цмс, а мы просто обновимся и все)))
 
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#43
@chez1k, дядь как ты сделал чтобы выдавало больше одного ответа?
 
Енот
Новичо́к, через «о́»
Регистрация
8 Сен 2018
Сообщения
142
#44
Енот
Новичо́к, через «о́»
Регистрация
5 Окт 2018
Сообщения
170
#45
Енот
Новичо́к, через «о́»
Регистрация
8 Сен 2018
Сообщения
142
#46
504 ошибку выдает, что-то типа ошибка сервера, 404 страница кстати работает.. Насчет фильтра только вечером смогу подсказать, делал не я, а брат, он вечером придет.
 
Новичо́к, через «о́»
Регистрация
2 Сен 2018
Сообщения
13
#49
Кто нибудь нашел решение autocomplete? Я перепробовал все ваши шаблоны но не получается... У одного только одну показывает. Другие вообще молчат. Кто нибудь нашел решение?
 
Енот
Новичо́к, через «о́»
Регистрация
9 Янв 2019
Сообщения
99
#50
Кто нибудь нашел решение autocomplete? Я перепробовал все ваши шаблоны но не получается... У одного только одну показывает. Другие вообще молчат. Кто нибудь нашел решение?
Я нашел в этой теме сайт чей-то) Попробовал заюзать у себя, в логах появились ошибки. И ищет не всегда через каждую букву.
До умного поиска далеко. Если бы такой придумать, было бы реально круто. Который искал бы даже с ошибками, с сериями сериалов и т. д.
 
Новичо́к, через «о́»
Регистрация
2 Сен 2018
Сообщения
13
#51
Я нашел в этой теме сайт чей-то) Попробовал заюзать у себя, в логах появились ошибки. И ищет не всегда через каждую букву.
До умного поиска далеко. Если бы такой придумать, было бы реально круто. Который искал бы даже с ошибками, с сериями сериалов и т. д.
Спасибо за отклик @mrhensley . А какой именно сайт, не могли бы уточнить? Я вроде умею кодить но тут у меня только одна подсказка всплывает и все, сейчас смог прикрутить только typeahead.js. Никак не могу настроить его чтоб показывал более одного title... Возможно есть кто смог? Или есть другой модуль или библиотека которую можно прикрутить?
 
Енот
Новичо́к, через «о́»
Регистрация
9 Янв 2019
Сообщения
99
#52
Спасибо за отклик @mrhensley . А какой именно сайт, не могли бы уточнить? Я вроде умею кодить но тут у меня только одна подсказка всплывает и все, сейчас смог прикрутить только typeahead.js. Никак не могу настроить его чтоб показывал более одного title... Возможно есть кто смог? Или есть другой модуль или библиотека которую можно прикрутить?
В этой теме 1 человек свой сайт спалил) Прямую ссылку не буду кидать, а то вдруг обидятся) Думаю найдете
 
Новичо́к, через «о́»
Регистрация
27 Фев 2019
Сообщения
8
#55
Под Firefox еще требует доработки. После ввода текста, GET запрос перенаправляет на JSON страницу, хотя возможно дело в Codepen.
Спасибо за наводку, проблема была в скрипте, исправил.
 
Енот
Новичо́к, через «о́»
Регистрация
26 Авг 2018
Сообщения
495
#62
Енот
Новичо́к, через «о́»
Регистрация
26 Авг 2018
Сообщения
495
#63
Может поделитесь опытом?
все делается в 3 шага буквально,
1-й шаг
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.0/axios.min.js"></script>
<script type="text/template" id="search-template">
<ul class="resultlist">
{{ if (movies.length === 0) { }}
<li class="resultlist__item">
<div class="resultlist__link">
<span class="resultlist__name h5">Ничего не найдено</span>
</div>
</li>
{{ } else { movies.slice(0, 5).forEach(function(item) { }}
<li class="resultlist__item">
<a class="resultlist__link" href="{{- item.url }}">
<span class="resultlist__title">
<span class="resultlist__name h5">{{- item.title }}</span>
{{ if (item.rating) { }}
<span class="badge badge--tiny badge--rating">
<i class="fas fa-star"></i> {{- item.rating / 10 }}
</span>
{{ } }}
</span>
<span class="resultlist__info">
{{ if (item.year) { }}
<small class="mr-auto">{{- item.genre }}</small>
{{ } }}
{{ if (item.year) { }}
<small class="ml-auto">{{- item.year }}</small>
{{ } }}
</span>
</a>
</li>
{{ }) } }}

{{ if (movies.length > 5) { }}
<li class="resultlist__item">
<a class="resultlist__link" href="{{- url}}">
<span class="resultlist__name h5">Показать все ({{- movies.length}})</span>
</a>
</li>
{{ } }}
</ul>
</script>
<script>
(function searchInit() {
var elems = document.querySelectorAll('.search-js');

_.toArray(elems).forEach(function(el) {

el.addEventListener('submit', searchHundler);
el.querySelector('input').addEventListener('input', _.debounce(function() {
var event = new Event('submit', {'cancelable': true});
this.parentNode.dispatchEvent(event);
}, 1000));

function searchHundler(event) {
event.preventDefault();

var input = this.querySelector('input'),
button = this.querySelector('button').firstElementChild;
container = this.lastElementChild;

if (input.value.length >= 3) requestResults(this, input.value, button);
else container.innerHTML = null;

function requestResults(form, query, button) {
button.classList.add('fa-spin', 'fa-spinner');

axios.get(form.action + '?json=1&q=' + query)
.then(function (response) {
response.data.url = form.action + '?q=' + query;
renderResults(response.data, form.lastElementChild);
})
.catch(function (error) {
alert('Поиск временно недоступен!');
}).then(function () {
button.classList.remove('fa-spin', 'fa-spinner');
});
}

function renderResults(data, container) {
_.templateSettings = {
evaluate: /{{([\s\S]+?)}}/g,
interpolate: /{{=([\s\S]+?)}}/g,
escape: /{{-([\s\S]+?)}}/g
};

var template = document.getElementById('search-template').innerHTML,
results = _.template(template);

container.innerHTML = results(data);
}

return false;
}
});
})();
</script>
2-й шаг
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css">
<style>
.search {
position: relative;
display: flex;
flex-grow: 1;
font-size: 0.875rem;
line-height: 1;
border-radius: 0.125rem;
background-color: #1f2122;
}
.search__control {
position: relative;
width: 100%;
color: inherit;
padding: 0.5rem;
padding-right: 2rem;
border: 1px solid transparent;
background-color: transparent;
transition: all 0.25s ease-in-out;
}
.search__control:focus {
border-color: #65a9e0;
}
.search__button {
position: absolute;
top: 50%;
right: 0;
display: block;
width: 2rem;
height: 100%;
color: inherit;
padding: 0;
border: none;
background-color: transparent;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
transition: all 0.25s ease-in-out;
}
.search__button:hover {
color: #65a9e0;
}
.search__button:focus {
outline: none;
}
.search__results {
position: absolute;
bottom: 0;
right: 0;
width: 100%;
z-index: 10;
}
.search__results--max-width ul {
max-width: 100%;
}

.resultlist {
position: absolute;
top: 0.5rem;
right: 0;
min-width: 100%;
list-style-type: none;
padding: 0;
margin-bottom: 0;
border-radius: 0.125rem;
box-shadow: 0 0.125rem 0.25rem 0 rgba(0, 0, 0, 0.125);
background-color: #1f2122;
overflow: hidden;
}
.resultlist__item {
border-bottom: 1px solid #25282a;
}
.resultlist__item:last-child {
border: none;
}
.resultlist__link {
display: block;
color: inherit;
text-decoration: none;
padding: 0.75rem;
transition: all 0.25s ease-in-out;
}
.resultlist__link:hover {
color: inherit;
text-decoration: none;
background-color: #303335;
}
.resultlist__title {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 0.25rem;
}
.resultlist__name {
max-width: 13.75rem;
white-space: nowrap;
text-overflow: ellipsis;
margin-bottom: 0;
margin-right: 0.75rem;
overflow: hidden;
}
.resultlist__info {
display: flex;
justify-content: space-between;
color: #dee2e6;
}

.badge {
display: inline-block;
font-size: 0.875rem;
font-weight: 500;
line-height: 1;
white-space: nowrap;
text-transform: uppercase;
padding: 0.25rem 0.5rem;
border-radius: 0.125rem;
background-color: #1f2122;
transition: all 0.25s ease-in-out;
cursor: default;
}
.badge:empty {
visibility: hidden;
}
.badge--info {
background-color: #6b737b;
}
.badge--rating {
color: #1f2122;
background-color: #f5c518;
}
.badge--justify {
display: flex;
justify-content: space-between;
}
.badge--small {
font-size: 0.75rem;
padding: 0.1875rem 0.375rem;
}
.badge--tiny {
font-size: 0.625rem;
padding: 0.125rem 0.25rem;
}
.badge--nobg {
padding: 0;
background-color: transparent;
}
.badge a {
color: inherit;
}
.badge a:hover {
color: #3b91d7;
text-decoration: none;
}
.badge i {
font-size: 87.5%;
line-height: 1.2;
vertical-align: baseline;
}
</style>
3-й шаг
<form class="search search-js" action="/<%- page.urls.search %>/title" method="get">
<input class="search__control" type="text" name="q" placeholder="Поиск">
<button class="search__button" type="submit">
<i class="fas fa-search"></i>
</button>

<div class="search__results"></div>
</form>

Спасибо "Kazik" подсказал мне что куда :)
 
Енот
Новичо́к, через «о́»
Регистрация
26 Май 2019
Сообщения
53
#65
пытаюсь сделать по такой системе https://ruseller.com/lessons.php?rub=37&id=2729

по сути выдает,но все данные выдает, ид, название, описание и тд

Посмотреть вложение 479

А при выборе из ответов, получаем это

Посмотреть вложение 480
аааааааа, ты сделал мой день, проорался в голос) Спасибо) тоже парюсь сейчас с этой фигней
 
Енот
Новичо́к, через «о́»
Регистрация
3 Мар 2018
Сообщения
360
#66
Может кто-то сделает видео, как и куда вставлять коды?
 
Енот
Новичо́к, через «о́»
Регистрация
26 Авг 2018
Сообщения
495
#67
Может кто-то сделает видео, как и куда вставлять коды?
Все же максимально просто расписано

Может поделитесь опытом?
все делается в 3 шага буквально,
1-й шаг
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.0/axios.min.js"></script>
<script type="text/template" id="search-template">
<ul class="resultlist">
{{ if (movies.length === 0) { }}
<li class="resultlist__item">
<div class="resultlist__link">
<span class="resultlist__name h5">Ничего не найдено</span>
</div>
</li>
{{ } else { movies.slice(0, 5).forEach(function(item) { }}
<li class="resultlist__item">
<a class="resultlist__link" href="{{- item.url }}">
<span class="resultlist__title">
<span class="resultlist__name h5">{{- item.title }}</span>
{{ if (item.rating) { }}
<span class="badge badge--tiny badge--rating">
<i class="fas fa-star"></i> {{- item.rating / 10 }}
</span>
{{ } }}
</span>
<span class="resultlist__info">
{{ if (item.year) { }}
<small class="mr-auto">{{- item.genre }}</small>
{{ } }}
{{ if (item.year) { }}
<small class="ml-auto">{{- item.year }}</small>
{{ } }}
</span>
</a>
</li>
{{ }) } }}

{{ if (movies.length > 5) { }}
<li class="resultlist__item">
<a class="resultlist__link" href="{{- url}}">
<span class="resultlist__name h5">Показать все ({{- movies.length}})</span>
</a>
</li>
{{ } }}
</ul>
</script>
<script>
(function searchInit() {
var elems = document.querySelectorAll('.search-js');

_.toArray(elems).forEach(function(el) {

el.addEventListener('submit', searchHundler);
el.querySelector('input').addEventListener('input', _.debounce(function() {
var event = new Event('submit', {'cancelable': true});
this.parentNode.dispatchEvent(event);
}, 1000));

function searchHundler(event) {
event.preventDefault();

var input = this.querySelector('input'),
button = this.querySelector('button').firstElementChild;
container = this.lastElementChild;

if (input.value.length >= 3) requestResults(this, input.value, button);
else container.innerHTML = null;

function requestResults(form, query, button) {
button.classList.add('fa-spin', 'fa-spinner');

axios.get(form.action + '?json=1&q=' + query)
.then(function (response) {
response.data.url = form.action + '?q=' + query;
renderResults(response.data, form.lastElementChild);
})
.catch(function (error) {
alert('Поиск временно недоступен!');
}).then(function () {
button.classList.remove('fa-spin', 'fa-spinner');
});
}

function renderResults(data, container) {
_.templateSettings = {
evaluate: /{{([\s\S]+?)}}/g,
interpolate: /{{=([\s\S]+?)}}/g,
escape: /{{-([\s\S]+?)}}/g
};

var template = document.getElementById('search-template').innerHTML,
results = _.template(template);

container.innerHTML = results(data);
}

return false;
}
});
})();
</script>
2-й шаг
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css">
<style>
.search {
position: relative;
display: flex;
flex-grow: 1;
font-size: 0.875rem;
line-height: 1;
border-radius: 0.125rem;
background-color: #1f2122;
}
.search__control {
position: relative;
width: 100%;
color: inherit;
padding: 0.5rem;
padding-right: 2rem;
border: 1px solid transparent;
background-color: transparent;
transition: all 0.25s ease-in-out;
}
.search__control:focus {
border-color: #65a9e0;
}
.search__button {
position: absolute;
top: 50%;
right: 0;
display: block;
width: 2rem;
height: 100%;
color: inherit;
padding: 0;
border: none;
background-color: transparent;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
transition: all 0.25s ease-in-out;
}
.search__button:hover {
color: #65a9e0;
}
.search__button:focus {
outline: none;
}
.search__results {
position: absolute;
bottom: 0;
right: 0;
width: 100%;
z-index: 10;
}
.search__results--max-width ul {
max-width: 100%;
}

.resultlist {
position: absolute;
top: 0.5rem;
right: 0;
min-width: 100%;
list-style-type: none;
padding: 0;
margin-bottom: 0;
border-radius: 0.125rem;
box-shadow: 0 0.125rem 0.25rem 0 rgba(0, 0, 0, 0.125);
background-color: #1f2122;
overflow: hidden;
}
.resultlist__item {
border-bottom: 1px solid #25282a;
}
.resultlist__item:last-child {
border: none;
}
.resultlist__link {
display: block;
color: inherit;
text-decoration: none;
padding: 0.75rem;
transition: all 0.25s ease-in-out;
}
.resultlist__link:hover {
color: inherit;
text-decoration: none;
background-color: #303335;
}
.resultlist__title {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 0.25rem;
}
.resultlist__name {
max-width: 13.75rem;
white-space: nowrap;
text-overflow: ellipsis;
margin-bottom: 0;
margin-right: 0.75rem;
overflow: hidden;
}
.resultlist__info {
display: flex;
justify-content: space-between;
color: #dee2e6;
}

.badge {
display: inline-block;
font-size: 0.875rem;
font-weight: 500;
line-height: 1;
white-space: nowrap;
text-transform: uppercase;
padding: 0.25rem 0.5rem;
border-radius: 0.125rem;
background-color: #1f2122;
transition: all 0.25s ease-in-out;
cursor: default;
}
.badge:empty {
visibility: hidden;
}
.badge--info {
background-color: #6b737b;
}
.badge--rating {
color: #1f2122;
background-color: #f5c518;
}
.badge--justify {
display: flex;
justify-content: space-between;
}
.badge--small {
font-size: 0.75rem;
padding: 0.1875rem 0.375rem;
}
.badge--tiny {
font-size: 0.625rem;
padding: 0.125rem 0.25rem;
}
.badge--nobg {
padding: 0;
background-color: transparent;
}
.badge a {
color: inherit;
}
.badge a:hover {
color: #3b91d7;
text-decoration: none;
}
.badge i {
font-size: 87.5%;
line-height: 1.2;
vertical-align: baseline;
}
</style>
3-й шаг
<form class="search search-js" action="/<%- page.urls.search %>/title" method="get">
<input class="search__control" type="text" name="q" placeholder="Поиск">
<button class="search__button" type="submit">
<i class="fas fa-search"></i>
</button>

<div class="search__results"></div>
</form>

Спасибо "Kazik" подсказал мне что куда :)