Индексация

03 мая 2019, 07:00

Индексация

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

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

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

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

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

Название По умолчанию Описание
mse2_index_comments true Включить индексирование комментариев компонента Tickets
mse2_index_comments_weight 1 Поисковый вес слова, встречающегося в комментарии
mse2_index_fields content:3,description:2,introtext:2,pagetitle:3,longtitle:3 Настройка индексирования полей ресурса. Имя поля и его поисковый вес через двоеточие.
mse2_index_min_words_length 4 Минимальная длина слова для участия в поиске

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

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

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

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

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

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

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

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

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

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

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

<?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
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;
}

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