Встала задача добавить в индекс Search API Solr несколько тысяч полей. Стандартный способ не подошёл, потому что уже после тысячи всё начинает дико тормозить. Основная загвоздка в том, что классу SearchApiSolrBackend
нужно, чтобы поле обязательно было в схеме, иначе при встрече незнакомого имени он выбрасывается эксепшен. Решение достаточно простое — создавать временные поля в рантайме. Пример индексирования заголовка ноды:
/**
* @SearchApiProcessor(
* id = "my_processor",
* label = @Translation("My processor"),
* description = @Translation("My search api processor."),
* stages = {
* "alter_items" = 0,
* },
* locked = false,
* hidden = false,
* )
*/
class MySearchApiProcessor extends ProcessorPluginBase {
/**
* {@inheritdoc}
*/
public function alterIndexedItems(array &$items): void {
$index = $this->getIndex();
$index_fields = $index->getFields();
// Create index field
$field_info = [
'type' => 'string',
'is_list' => FALSE,
'property_path' => 'my_label',
'processor_id' => 'my_processor',
];
$field_name = 'my_label';
$index_fields[$field_name] = \Drupal::service('search_api.fields_helper')->createField($index, $field_name, $field_info + [
'data_definition' => new ProcessorProperty($field_info),
]);
$index->setFields($index_fields);
foreach ($items as $item) {
$entity_adapter = $item->getOriginalObject();
// Create item field
$field = clone $index_fields[$field_name];
$field->setValues([$entity_adapter->label()]);
$item->setField($field_name, $field);
}
// Clear solr backend fields static cache
$index->getServerInstance()->getBackend()->getLanguageSpecificSolrFieldNames('', NULL, TRUE);
}
}
Написанное актуально для
Drupal 9, Search API 1.27, Search API Solr 4.2.9
Добавить комментарий