[mSearch2] 1.5.2 - произвольные слова в индексе

Представляю вам новую версию mSearch2 с небольшим, но очень важным изменением в логике работы индексации.

Теперь вы можете добавлять любые произвольные поля и слова в индекс буквально на лету, свои плагином на событие 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».


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

Новая версия уже в магазине, можно обновляться.
Василий Наумкин
25 декабря 2015, 03:46
modx.pro
7
3 195
+9

Комментарии: 12

Abu
Abu
27 декабря 2015, 00:13
1
+3
В копилку полезных плагинов — добавление тегов (опций modx_ms2_product_options) в поисковый индекс.

<?php
switch ($modx->event->name) {
	case 'mse2OnBeforeSearchIndex':

        $key = 'tags'; // имя опции товара
        $category = 0; // фильтрация по категории
        
	$mSearch2->fields[$key] = 1;
        $q = $modx->newQuery('msProductOption');
        $q->innerJoin('msProduct', 'msProduct', 'msProduct.id=msProductOption.product_id');
        $q->sortby('msProductOption.value','ASC');
        $q->select('DISTINCT(msProductOption.value), msProduct.id');
        $q->where(array('msProductOption.key' => $key));

        if (!empty($category)) {
        	$ids = $modx->getChildIds($category);
        	$ids[] = $category;
        	$q->innerJoin('msCategory', 'msCategory', 'msCategory.id=msProduct.parent');
        	$q->where(array('msCategory.id:IN' => $ids));
        }
        if ($q->prepare() && $q->stmt->execute()) {
        	while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
        		$resource = $modx->getObject('modResource', $row['id']);
        		$resource->set($key, $row['value']);
        	}
    
        }
	break;
}
    Григорий Коленько
    09 февраля 2016, 23:17
    0
    Вопрос, а зачем, если (как я понял из примера Василия) уже при вызове туда передается объект со страницей?
    Т.е. опять же как я понимаю, из примера, каждый раз когда ресурс добавляется в индекс, срабатывает «mse2OnBeforeSearchIndex»?
    $resource = $modx->getObject('modResource', $row['id']);
      Василий Наумкин
      13 сентября 2016, 18:51
      2
      +2
      Более оптимальный код для добавления опции товара в поисковый индекс:
      <?php
      switch ($modx->event->name) {
          case 'mse2OnBeforeSearchIndex':
              $key = 'tags'; // имя опции товара
              
              $mSearch2->fields[$key] = 1;
              $q = $modx->newQuery('msProductOption', array(
                  'product_id' => $resource->id,
                  'key' => $key,
              ));
              $q->select('value');
              if ($q->prepare() && $q->stmt->execute()) {
                  $value = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
                  if (!empty($value[0])) {
                      $resource->set($key, $value);
                  }
              }
          break;
      }
      Григорий Коленько
      09 февраля 2016, 23:17
      0
      del
        Григорий Коленько
        09 февраля 2016, 23:57
        0
        Этот способ не работает, почему-то если попробовать присвоить «Tichý František». Ничего в таблицу не пишется
        Григорий Коленько
        10 февраля 2016, 00:19
        0
        Вообще оказывается чешские слова добавляются как-то странно.

        Хорошо, что на написание символов поиск не обращает внимание, и большая часть из них (áčďéěíňóřšťúůýž) вырезается и заменяется на символы из английского, но к примеру на первом скрине, в третьей строке сверху слово «signováno», по нему теперь ничего не найдет.



          Григорий Коленько
          10 февраля 2016, 00:32
          0
          вырезается и заменяется на символы из английского
          Не, это не делается оказывается :)
            Григорий Коленько
            10 февраля 2016, 01:17
            0
            Поразглядывая таблицу, все-таки понял, что символы все-таки подменяет на стандартные английские. Вот только если символ на конце слова, то начинаются проблемы
              Григорий Коленько
              10 февраля 2016, 02:46
              0
              В общем копал-копал, пока не понял, что tinymcerte конвертирует зачем-то именно так, и контент превращается в кашу из символов. Пришлось все ресурсы перелопатить и дописать в конфиге tinymcerte 1 строчку, чтобы было нормально.
              Все что писал выше не актуально. Не на то грешил. Все работает теперь как надо :)
          Василий Столейков
          17 апреля 2017, 11:14
          0
          Можно ли добавить в индекс тикет, который создаётся и изменяется минуя процессоры и события, то есть обычными
          $resource = $modx->getObject('modResource',$id);
          $resource->save();
          Есть ли возможность добавить в индекс поля тикета в своём коде?
            Василий Столейков
            17 апреля 2017, 13:28
            0
            Отвечу на свой же вопрос: есть возможность.
            Код из родного плагина компонента:
            $id = 365425; // главное указать нужный id
            if (!empty($id)) {
            	/* @var modProcessorResponse $response */
            	$response = $modx->runProcessor('mgr/index/update', array('id' => $id), array('processors_path' => MODX_CORE_PATH . 'components/msearch2/processors/'));
            
            	if ($response->isError()) {
            		$modx->log(modX::LOG_LEVEL_ERROR, print_r($response->getAllErrors(), true));
            	}
            }
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            12