Настройка Sphinx

Поисковая система Sphinx индексирует все типы данных, являющиеся дочерними к типу данных "Раздел сайта".
Индексации подлежат следующие поля этих типов данных: 'title', 'h1', 'meta_keywords', 'meta_descriptions', 'content', 'tags', 'is_unindexed', 'readme', 'anons', 'description', 'descr', 'message', 'question', 'answers'. Эти поля нельзя исключить из индексации.
Весовые коэффициенты первых шести типов полей настраиваются через административный интерфейс.

Настройка весовых коэффициентов

Чтобы указать весовые коэффициенты для остальных полей, необходимо выполнить следующее:

  • В файле classes/modules/search/custom_events.php добавить слушатель события sphinxExecute.
    <?php  new UmiEventListener("sphinxExecute", "search", "customSphinxExecute");?>
  • В файле classes/modules/search/__custom_adm.php добавить метод customSphinxExecute() - обработчик события sphinxExecute.
    <?php
    	abstract class __search_custom_admin {
    		public function customSphinxExecute(iUmiEventPoint $event) {
    			if($event->getMode() == 'before') {
    				$sphinx = $event->getParam('sphinx');
    				if ($sphinx instanceof SphinxClient) {
    					
    					$fieldWeights = array(
    						'anons' => 10
    					);
    				
    					$sphinx->setFieldWeights($fieldWeights);
    				}
    			}
    		}
    	};
    ?> 
  • В массив $fieldWeights передаются пары значений "имя_поля" => "вес", далее у объекта sphinx вызывается метод setFieldWeights(), который задает значения перечисленных полей. Указанные весовые коэффициенты будут применяться при каждом поисковом запросе.

Добавление кастомных полей

Чтобы добавить в конфигурацию Sphinx поля, не входящие в список, указанный выше, необходимо выполнить следующее:

  • В файле classes/modules/search/custom_events.php добавить слушатель события sphinxCreateView.
    <?php  new UmiEventListener("sphinxCreateView", "search", "customCreateView"); ?>
  • В файле classes/modules/search/__custom_adm.php добавить метод customCreateView() - обработчик события sphinxCreateView.
    <?php
    	abstract class __search_custom_admin {
    		public function customCreateView(iUmiEventPoint $event) {
    			if($event->getMode() == 'before') {
    				$contentIndex = $event->getRef('contentIndex');
    				if ($contentIndex instanceof SphinxIndexGenerator) {
    					$types = umiObjectTypesCollection::getInstance();
    
    					$pagesType = $types->getSubTypesList($types->getType('root-pages-type')->getId());
    
    					$indexFields = array(
    						'custom_f1'
    					);
    
    					$contentIndex->addPagesList($pagesType, $types, $indexFields);
    				}
    			}
    		}
    	};
    ?>

    В массив $indexFields передается список полей, которые нужно добавить к индексированию. Далее у объекта contentIndex вызывается метод addPagesList(), который добавляет новые поля к списку. После выполнения этого обработчика события необходимо повторно сгенерировать конфигурацию плоской таблицы в административном интерфейсе модуля "Поиск".