[mSearch2] 1.5.2 - произвольные слова в индексе
Представляю вам новую версию mSearch2 с небольшим, но очень важным изменением в логике работы индексации.
Теперь вы можете добавлять любые произвольные поля и слова в индекс буквально на лету, свои плагином на событие mse2OnBeforeSearchIndex:
В данном примере всем ресурсам добавится в индекс поле my_field со словом «WORDS» («my» не попадёт в индекс из-за ограничения длины по умолчанию), а товарам miniShop2 будет добавлено еще и product_field со словами «Product» и «Property».
Таким образом вы можете добавить ресурсу любые поля и они проиндексируется согласно правил сайта.
Новая версия уже в магазине, можно обновляться.
Теперь вы можете добавлять любые произвольные поля и слова в индекс буквально на лету, свои плагином на событие 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».
Таким образом вы можете добавить ресурсу любые поля и они проиндексируется согласно правил сайта.
Новая версия уже в магазине, можно обновляться.
Комментарии: 12
В копилку полезных плагинов — добавление тегов (опций 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;
}
Вопрос, а зачем, если (как я понял из примера Василия) уже при вызове туда передается объект со страницей?
Т.е. опять же как я понимаю, из примера, каждый раз когда ресурс добавляется в индекс, срабатывает «mse2OnBeforeSearchIndex»?
Т.е. опять же как я понимаю, из примера, каждый раз когда ресурс добавляется в индекс, срабатывает «mse2OnBeforeSearchIndex»?
$resource = $modx->getObject('modResource', $row['id']);
Более оптимальный код для добавления опции товара в поисковый индекс:
<?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;
}
del
Этот способ не работает, почему-то если попробовать присвоить «Tichý František». Ничего в таблицу не пишется
Неактуально
Вообще оказывается чешские слова добавляются как-то странно.
Хорошо, что на написание символов поиск не обращает внимание, и большая часть из них (áčďéěíňóřšťúůýž) вырезается и заменяется на символы из английского, но к примеру на первом скрине, в третьей строке сверху слово «signováno», по нему теперь ничего не найдет.
Хорошо, что на написание символов поиск не обращает внимание, и большая часть из них (áčďéěíňóřšťúůýž) вырезается и заменяется на символы из английского, но к примеру на первом скрине, в третьей строке сверху слово «signováno», по нему теперь ничего не найдет.
Не, это не делается оказывается :)
Поразглядывая таблицу, все-таки понял, что символы все-таки подменяет на стандартные английские. Вот только если символ на конце слова, то начинаются проблемы
В общем копал-копал, пока не понял, что tinymcerte конвертирует зачем-то именно так, и контент превращается в кашу из символов. Пришлось все ресурсы перелопатить и дописать в конфиге tinymcerte 1 строчку, чтобы было нормально.
Все что писал выше не актуально. Не на то грешил. Все работает теперь как надо :)
Все что писал выше не актуально. Не на то грешил. Все работает теперь как надо :)
Можно ли добавить в индекс тикет, который создаётся и изменяется минуя процессоры и события, то есть обычными
$resource = $modx->getObject('modResource',$id);
$resource->save();
Есть ли возможность добавить в индекс поля тикета в своём коде?
Отвечу на свой же вопрос: есть возможность.
Код из родного плагина компонента:
Код из родного плагина компонента:
$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));
}
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.