Skip to content
  1. Компоненты
  2. mSearch2
  3. Администрирование
  4. Индексация

Индексация

Страница для создания поискового индекса.

Построение индекса — это тяжелая операция, поэтому она разбивается на множество запросов, которые отправляются через Ajax в цикле.

Вы можете указать, по сколько ресурсов за раз нужно индексировать ваш сайт. 10 ресурсов - оптимальное значение. Однако, если вы получаете ошибку timeout, уменьшите это число.

В зависимости от системных настроек из БД извлекаются нужные колонки ресурсов, комментарии и разбиваются на слова. Затем по каждому слову генерируются словоформы, при помощи phpMorphy и сохраняются в таблицу индекса.

Системные настройки

НазваниеПо умолчаниюОписание
mse2_index_commentstrueВключить индексирование комментариев компонента Tickets
mse2_index_comments_weight1Поисковый вес слова, встречающегося в комментарии
mse2_index_fieldscontent:3, description:2, introtext:2, pagetitle:3, longtitle:3Настройка индексирования полей ресурса. Имя поля и его поисковый вес через двоеточие.
mse2_index_min_words_length4Минимальная длина слова для участия в поиске

Самым важным параметром является mse2_index_fields, именно он определяет, какую ценность представляют слова в разных полях документа.

Логика работы

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

Благодаря специальному алгоритму, можно индексировать необычные поля документов, например свойства товаров miniShop2, просто указав их в настройках наравне со всеми. Обратите внимание, что miniShop2 также умеет выдавать данные из таблицы msVendor, если указать поле с префиксом vendor_. Например, можно индексировать vendor_name, для поиска по имени производителя.

Для индексации ТВ-параметров используйте префикс tv_, например tv_subtitle:3.

Также mSearch2 умеет индексировать комментарии Tickets, соответствующая настройка включена по умолчанию.

Таким образом, весь ваш сайт разбивается на тысячи вариантов слов, по которым и будет происходить поиск. В индекс попадают только те документы, у которых отмечен параметр searchable — то есть, они "Участвует в поиске".

Благодаря плагину, входящему в комплект, вам не нужно следить за актуальностью индекса — он делает всё сам, в полном соответствии с системными настройками, срабатывая на событие OnDocFormSave.

Генерировать поисковый индекс в админке нужно ровно в двух случаях:

  • При первой установке компонента
  • При изменении системных настроек, отвечающих за индексацию

Добавление произвольных слов в индекс

Бывают случаи, когда вам нужно добавить в индекс к документам какие-то свои произвольные слова. Для этого с версии 1.5.2-pl можно использовать плагин на событие mse2OnBeforeSearchIndex:

php
<?php
switch ($modx->event->name) {
  case 'mse2OnBeforeSearchIndex':
    $mSearch2->fields['my_field'] = 1;
    $resource->set('my_field', 'My Words');

    if ($resource->get('class_key') == 'msProduct') {
      $mSearch2->fields['product_field'] = 1;
      $resource->set('product_field', 'Product Property');
    }
    break;
}

В данном примере всем ресурсам добавится в индекс поле my_field со словом "WORDS" ("my" не попадёт в индекс из-за ограничения длины по умолчанию), а товарам miniShop2 будет добавлено еще и product_field со словами "Product" и "Property".

Таким образом вы можете добавлять абсолютно любые произвольные слова в индекс ресурсов.

Индексация опций товаров

Другой пример работы добавления произвольных слов в индекс - индексация опций товара miniShop2

php
<?php
switch ($modx->event->name) {
  case 'mse2OnBeforeSearchIndex':
    // Имена опций
    $names = array(
      'option1',
      'option2'
    );

    foreach ($names as $key) {
      $mSearch2->fields[$key] = 1;
      $c = $modx->newQuery('msProductOption', array(
        'product_id' => $resource->id,
        'key' => $key,
      ));
      $c->select('value');
      if ($c->prepare() && $c->stmt->execute()) {
        $value = $c->stmt->fetchAll(PDO::FETCH_COLUMN);
        if (!empty($value[0])) {
          $resource->set($key, $value);
        }
      }
    }
    break;
}

Конечно, вам нужно будет прописать разбор и сохранение необычных опций, если таковые будут.