Drupal → Индексирование полей, которых нет в схеме Search API Solr

01.11.2022

Встала задача добавить в индекс 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
Похожие записи

Добавить комментарий