search_api-8.x-1.15/src/Plugin/search_api/processor/Stopwords.php

src/Plugin/search_api/processor/Stopwords.php
<?php

namespace Drupal\search_api\Plugin\search_api\processor;

use Drupal\Core\Form\FormStateInterface;
use Drupal\search_api\Processor\FieldsProcessorPluginBase;
use Drupal\search_api\Query\QueryInterface;

/**
 * Allows you to define stopwords which will be ignored in searches.
 *
 * @SearchApiProcessor(
 *   id = "stopwords",
 *   label = @Translation("Stopwords"),
 *   description = @Translation("Allows you to define stopwords which will be ignored in searches. <strong>Caution:</strong> Only use after both 'Ignore case' and 'Tokenizer' have run."),
 *   stages = {
 *     "pre_index_save" = 0,
 *     "preprocess_index" = -5,
 *     "preprocess_query" = -2,
 *   }
 * )
 */
class Stopwords extends FieldsProcessorPluginBase {

  /**
   * Holds all words ignored for the last query.
   *
   * @var string[]
   */
  protected $ignored = [];

  /**
   * An array whose keys and values are the stopwords set for this processor.
   *
   * @var string[]
   */
  protected $stopwords;

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    $configuration = parent::defaultConfiguration();

    $configuration += [
      'stopwords' => [
        'a', 'an', 'and', 'are', 'as', 'at', 'be', 'but', 'by', 'for', 'if',
        'in', 'into', 'is', 'it', 'no', 'not', 'of', 'on', 'or', 's', 'such',
        't', 'that', 'the', 'their', 'then', 'there', 'these', 'they', 'this',
        'to', 'was', 'will', 'with',
      ],
    ];

    return $configuration;
  }

  /**
   * {@inheritdoc}
   */
  public function setConfiguration(array $configuration) {
    parent::setConfiguration($configuration);
    unset($this->stopwords);
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);

    $stopwords = $this->getConfiguration()['stopwords'];
    if (is_array($stopwords)) {
      $default_value = implode("\n", $stopwords);
    }
    else {
      $default_value = $stopwords;
    }
    $description = $this->t('Enter a list of stopwords, each on a separate line, that will be removed from content before it is indexed and from search terms before searching. <a href=":url">More info about stopwords.</a>.', [':url' => 'https://en.wikipedia.org/wiki/Stop_words']);

    $form['stopwords'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Stopwords'),
      '#description' => $description,
      '#default_value' => $default_value,
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    // Convert our text input to an array.
    $form_state->setValue('stopwords', array_filter(array_map('trim', explode("\n", $form_state->getValues()['stopwords'])), 'strlen'));

    parent::submitConfigurationForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function preprocessSearchQuery(QueryInterface $query) {
    $this->ignored = [];
    parent::preprocessSearchQuery($query);

    $results = $query->getResults();
    foreach ($this->ignored as $ignored_search_key) {
      $results->addIgnoredSearchKey($ignored_search_key);
    }
  }

  /**
   * {@inheritdoc}
   */
  protected function testType($type) {
    return $this->getDataTypeHelper()->isTextType($type);
  }

  /**
   * {@inheritdoc}
   */
  protected function process(&$value) {
    $stopwords = $this->getStopWords();
    if (empty($stopwords) || !is_string($value)) {
      return;
    }
    $value = trim($value);
    if (isset($stopwords[$value])) {
      $this->ignored[$value] = $value;
      $value = '';
    }
  }

  /**
   * Gets the stopwords for this processor.
   *
   * @return string[]
   *   An array whose keys and values are the stopwords set for this processor.
   */
  protected function getStopWords() {
    if (!isset($this->stopwords)) {
      $this->stopwords = array_combine($this->configuration['stopwords'], $this->configuration['stopwords']);
    }
    return $this->stopwords;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc