it-swarm.com.de

Programmgesteuerte Verwendung der Such-API

Ich habe gelesen und versucht https://www.drupal.org/docs/8/modules/search-api/developer-documentation/executing-a-search-in-code

Ich verwende drupal 8 und verwende den Standardinhaltsindex zum Testen. Ich kann den folgenden Code ausführen und erhalte eine Ergebnisanzahl, jedoch keine Ergebniselemente.

$index = \Drupal\search_api\Entity\Index::load('default_index');
$query = $index->query();

// Change the parse mode for the search.
$parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
  ->createInstance('direct');
$parse_mode->setConjunction('OR');
$query->setParseMode($parse_mode);

// Set fulltext search keywords and fields.
$query->keys('');
$query->setFulltextFields(['title', 'name', 'body']);

// Do paging.
$query->range(20, 10);

// Set one or more tags for the query.
// @see hook_search_api_query_TAG_alter()
// @see hook_search_api_results_TAG_alter()
$query->addTag('custom_search');

// Execute the search.
$results = $query->execute();

echo "Result count: {$results->getResultCount()}\n";
$ids = implode(', ', array_keys($results->getResultItems()));
echo "Returned IDs: $ids.\n";

Count zeigt einen Wert an, aber ich kann keine Ergebniselemente erhalten. Ich habe es mit $ query-> keys ('') versucht; $ query-> keys ('*'); und ein Wert $ query-> keys ('ein Wert'); In allen Fällen scheint die Zählung korrekt zu sein. Die Suche scheint daher korrekt ausgeführt zu werden, aber wie kann ich die Elemente abrufen?

2
Thomas0878
    //first just run this line
    kint($results);
    //and then you can uncomment the next lines, in my case I needed the response key 'elasticsearch_response'
    $response = $results->getExtraData('elasticsearch_response', []);
    $hits = $response['hits']['hits'];
    foreach($hits as $hit){
      kint($hit);
    }
1
GZveri

Habe gerade diesen alten Beitrag beim Debuggen des gleichen Problems gefunden. Hinzufügen meines Fixes für den Fall, dass andere es auch treffen ..

Das Problem bei der Verwendung des Beispielcodes war folgende Zeile:

// Do paging.
$query->range(20, 10);

Da ich nur wenige Datensätze in meiner Datenbank hatte, gab es nicht mehr als 20 Datensätze, die Gesamtzahl war korrekt, konnte aber nicht so weit blättern.

Aktualisierung auf:

// Do paging.
$query->range(0, 10);

Mein Problem wurde behoben.

1
Mubashar Iqbal

Sie müssen iterieren und sie erhalten. Hier ist eine Möglichkeit, wie ich es gemacht habe:

$results = $query->execute();
$output = '';

foreach ($results as $result) {
  $value = $result->getField('fieldname')->getValues();
  $output .= $value[0];
}
0
Kevin