protected function Highlight::addExcerpts in Search API 8
Adds excerpts to all results, if possible.
Parameters
\Drupal\search_api\Item\ItemInterface[] $results: The result items to which excerpts should be added.
string[] $fulltext_fields: The fulltext fields from which the excerpt should be created.
array $keys: The search keys to use for highlighting.
1 call to Highlight::addExcerpts()
- Highlight::postprocessSearchResults in src/Plugin/ search_api/ processor/ Highlight.php 
- Postprocess search results before they are returned by the query.
File
- src/Plugin/ search_api/ processor/ Highlight.php, line 274 
Class
- Highlight
- Adds a highlighted excerpt to results and highlights returned fields.
Namespace
Drupal\search_api\Plugin\search_api\processorCode
protected function addExcerpts(array $results, array $fulltext_fields, array $keys) {
  $items = $this
    ->getFulltextFields($results, $fulltext_fields);
  foreach ($items as $item_id => $item) {
    if (!$item) {
      continue;
    }
    // We call array_merge() using call_user_func_array() to prevent having to
    // use it in a loop because it is a resource greedy construction.
    // @see https://github.com/kalessil/phpinspectionsea/blob/master/docs/performance.md#slow-array-function-used-in-loop
    $text = call_user_func_array('array_merge', array_values($item));
    $item_keys = $keys;
    // If the backend already did highlighting and told us the exact keys it
    // found in the item's text values, we can use those for our own
    // highlighting. This will help us take stemming, transliteration, etc.
    // into account properly.
    $highlighted_keys = $results[$item_id]
      ->getExtraData('highlighted_keys');
    if ($highlighted_keys) {
      $item_keys = array_unique(array_merge($keys, $highlighted_keys));
    }
    // @todo This is pretty poor handling for the borders between different
    //   values/fields. Better would be to pass an array and have proper
    //   handling of this in createExcerpt(), ensuring that no snippet goes
    //   across multiple values/fields.
    $results[$item_id]
      ->setExcerpt($this
      ->createExcerpt(implode($this
      ->getEllipses()[1], $text), $item_keys));
  }
}