Живой поиск на Drupal 7

Главные вкладки

gun_dose 15 ноября 2016 в 20:45
15

Сегодня я вам расскажу, как сделать живой поиск на друпал. Для этого нам понадобятся:

Search API
Search API Database Search
Search API pages
Search API live results
Скачиваем и включаем все эти модули вручную или по-нормальному через
drush en search_api search_api_db search_api_page search_api_live_results -y
Затем идём в "Конфигурация - Поиск и метаданные - Search API - Добавить сервер" и заполняем там поля, как показано на картинке ниже. Поле "минимальная длина слова" определяет, после ввода скольких символов будут появляться результаты. Один символ - это насилие над базой данных, а вот 3-5 - в самый раз. Галочка "Искать по частичным совпадениям" означает, что поиск будет вестись по фрагментам слов. Если её не выставить, то результаты будут находиться только по целым словам, что не всегда удобно.
db_server
Теперь, когда у нас есть сервер, можно создать поисковый индекс. Идём аналогично - "Конфигурация - Поиск и метаданные - Search API - Добавить индекс" и заполняем там поля следующим образом: имя - любое вменяемое имя, машинное имя, согласно правилам для машинных имён drupal, "Тип элемента" - тип сущности (материал(нода), термин таксономии и т.д. Тут как правило, имеет смысл выбирать именно материал, если у вас есть например связанные продукты commerce - их поля потом можно будет также добавить. "Наборы" - выбираем те типы материалов, которые собираемся индексировать. Тут важно не забыть никакой тип, но и не ставить галочки туда, куда не надо, чтобы не захламлять базу данных. В поле "Сервер" выбираем наш только что созданный сервер. "Только чтение" - не трогаем, оставляем невыбранным. "Проиндексировать элементы сразу" - выставляем обязательно. Если не выставить, то новые материалы в индексе будут появляться только по крону, если же выставить, то любые изменения будут индексироваться сразу. "Cron batch size" - оставляем, как есть - 50. Это означает, что если есть что-то неиндексированное, то по крону будет индексироваться по 50 элементов. Сорри, что не сделал скрин - он был бы слишком длинный и не очень информативный Smile

После нажатия кнопки сохранить нас перебросит на форму добавления полей в индекс. Я обычно выбираю в добавок ко всему остальному тип материала и ID. Для живого поиска выбираем заголовок и Body. Если у вас есть ещё какие-то важные текстовые поля, выберите и их. Важно: выбирайте для текстовых полей тип Fulltext, т.к. в Fulltext можно производить поиск по фрагментам текста. Однако, Fulltext не позволяет делать сортировку, для этого нужен тип "Строка". Если же вы хотите искать и сортировать по одному и тому же полю, то это можно настроить на вкладке "Фильтры" в настройках поискового индекса, но об этом я расскажу как-нибудь в следующий раз Smile

Если вы ищете в полях Body, не отчаивайтесь. Текст с форматом ввода - это сложносоставное поле, поэтому его нужно добавлять как связанное поле. Да-да, вот там внизу кнопка "Добавить связанные поля". Но прежде чем жать эту кнопку, сохраните форму, иначе внесённые изменения потеряются! Такая вот засада. На этом с поисковым индексом пока всё.

Теперь нам нужна форма поиска для нашего поискового индекса. Стандартная форма нам не подходит, т.к. это вообще другой поиск. К слову, при использовании Search API стандартный модуль поиска Search лучше отключить и анинсталлить. А для формы поиска нам нужен модуль Search API Pages. Идём в "Конфигурация - Поиск и метаданные - Search API - Страницы поиска - Добавить страницу поиска". Там всё просто - вводим заголовок поисковой страницы и её путь, выбираем наш поисковый индекс, остальное по вкусу и согласно здравому смыслу.

И последний шаг - включить живой поиск. Для этого идём на страницу редактирования поискового индекса, заходим на вкладку Live Results и ставим галочку напротив недавно созданной страницы поиска. Сохраняемся. Если нажать "Изменить", то можно задать количество выпадающих результатов и тип отображения - просто кликабельное название либо стиль отображения live results search. К слову, этот стиль отображения полностью настраивается в настройках отображения материала, а также есть шаблон для него, который можно найти в папке модуля. Естественно, для переопределения шаблона надо скопировать его в свою тему.

Форма поиска доступна как блок на странице управления блоками. Также её можно вызвать программно:

<?php
$search_page 
entity_load_single('search_api_page'1);
$search_form drupal_get_form('search_api_page_search_form_search'$search_page);
?>

Поздравляю! Теперь ваш сайт стал чуточку менее колхозным, ведь около 100% разработчиков практически не волнуются о том, как работает окошко поиска на сайте, в результате чего оно не всегда работает в принципе. А если вы сделали всё по инструкции, то у вас должна получиться красота такая же, как на картинке в начале статьи. Ну само собой, что надо ещё немного поверстать, чтобы оно смотрелось как на этой картинке:
Живой поиск

PS: на всякий случай, не надо путать live results и автокомплит, т.к. у них в корне разное поведение. Если по клику на живой результат вы переходите на его страницу, то по клику на вариант из автокомплита этот вариант просто вставляется в окно ввода текста и это логично, ведь автодополнение должно просто помогать вводить данные и ничего более.

И в качестве спама, ссылка эту статью в моём говноблоге, в который впрочем, кроме этой статьи, я за два года ничего толкового не написал.

Автор

Комментарии

Аватар пользователя Daniil Pchelintsev Daniil Pchelintsev 5 ноября 2019 в 7:53

Добрый день. все работает отчлино, только выводится один заголовок. Как сделать чтоб вывод именно в блоке поиска был допустим с картинкой. (если зайти на страницу поиска и нажать поиск то он выводит как как нужно, например анонсы, а вот в жимов поиске показывает только заголовки). Заранее спасибо.

Аватар пользователя BigDogsRu BigDogsRu 23 марта 2020 в 16:37

Здравствуйте!
Огромное спасибо, всё работает.
Пара вопросов:
1) Как русифицировать системные сообщения на странице с результатами? Сейчас всё по-английски.
2) Так никто и не нашел ответ по сортировке результатов?

Аватар пользователя ivnish ivnish 23 марта 2020 в 16:39

1) Как русифицировать системные сообщения на странице с результатами? Сейчас всё по-английски.

Через "перевод интерфейса" друпала

2) Так никто и не нашел ответ по сортировке результатов?

Модуль Search API Sorts

Аватар пользователя Sennheiser Sennheiser 1 апреля 2020 в 20:40

Сейчас выводит живые результаты, если вбить 4 символа. Как сделать чтобы выводил уже по 2-м.

Поле "минимальная длина слова" определяет, после ввода скольких символов будут появляться результаты.

поставил 2, но всё равно не работает

Аватар пользователя Faith Faith 6 ноября 2020 в 16:01

У кого кривые результаты отображает или всю ноду, помогло в шаблоне ноды:
<? if($view_mode == 'live_results_search'): ?>
темизация
<? endif; ?>

Аватар пользователя redizka redizka 28 ноября 2020 в 20:37

А как сделать такой же поиск но по терминам?
Сделал все по инструкции, указал термины вместо нод, выбрал заголовки. Но живой поиск не ныводит термины. Выводит в коде ссылки без имени формата node/id_термина.
Просто поиск по нажатию кнопки выводит правильные результаты, а как их же вывести в живой поиск?

Аватар пользователя iKyzbma iKyzbma 13 декабря 2021 в 14:24

Sennheiser wrote:
Сейчас выводит живые результаты, если вбить 4 символа. Как сделать чтобы выводил уже по 2-м.
Поле "минимальная длина слова" определяет, после ввода скольких символов будут появляться результаты.
поставил 2, но всё равно не работает

Шансов мало, но... Вы как-то решили данную проблему? Столкнулся с тем же, не могу понять как это работает.

Аватар пользователя flexstat flexstat 27 июля 2022 в 11:18

Пытаюсь разобраться как вывести напротив каждого полученного результата, тип материала к которому он относится, перекопал всю документацию, так и не понял как это можно решить в Search API live results.
Буду очень признателен за любую помощь.