Добавление полей в поиск Sphinx

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 20

Задача

Нужно решить 2 проблемы:
1. По умолчанию Sphinx не индексирует кастомные поля.
2. По умолчанию Sphinx выполняет индексацию полей объектов тех типов данных, которые являются дочерними для типа данных "Раздел сайта". Если на сайте имеются, например, объекты, дочерние типу "Объект каталога", их поля не попадут в индекс.

Решение

Подразумевается, что Sphinx уже настроен и используется UMI.CMS.
В модуле "Поиск", при нажатии на кнопку "Генерация конфигурации" происходит добавление полей в индексную таблицу, а также запускается событие sphinxCreateView.

Создадим слушатель события sphinxCreateView

в файле /classes/components/search/custom_events.php

<?php
	new UmiEventListener("sphinxCreateView", "search", "customCreateView");

Создадим обработчик события customCreateView

в файле /classes/components/search/customMacros.php

<?php
public function customCreateView(iUmiEventPoint $event) {
    if($event->getMode() == 'before') {
        $contentIndex = $event->getRef('contentIndex');
        if ($contentIndex instanceof SphinxIndexGenerator) {
            $types = umiObjectTypesCollection::getInstance();

            // Получаем типы данных, дочерние типу "Раздел сайта"
            // 'root-pages-type' - это guid типа данных "Раздел сайта" в БД в таблице cms3_object_types
            $subRootPages = $types->getSubTypesList($types->getType('root-pages-type')->getId());

            // Получаем типы данных, дочерние типу данных "Объект каталога"
            // 'catalog-object' - это guid типа данных "Объект каталога" в БД в таблице cms3_object_types
            $subCatalogPages = $types->getSubTypesList($types->getType('catalog-object')->getId());

            // Объединяем полученные типы данных в один массив
            $pagesType = array_merge($subRootPages, $subCatalogPages);
					
            // Перечисляем идентификаторы полей, которые хотим добавить в индекс
            $indexFields = [
                'testovoe',
                'volume',
                'portability'
            ];

            $contentIndex->addPagesList($pagesType, $types, $indexFields);
        }
    }
}

Таким образом все типы данных, дочерние типу "Объект каталога", а также поля, перечисленные в массиве $indexFields, попадут в индексную таблицу и по ним будет работать поиск на сайте.