私は読んで試しました https://www.drupal.org/docs/8/modules/search-api/developer-documentation/executing-a-search-in-code
drupal 8を使用しており、デフォルトのコンテンツインデックスをテストに使用しています。次のコードを実行できますが、結果カウントは取得できますが、結果アイテムは取得できません。
$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";
カウントは値を示していますが、結果アイテムを取得できません。 $ query-> keys( '');で試しました。 $ query-> keys( '*');いくつかの値$ query-> keys( 'some value');すべての場合で、カウントは正しいようです。したがって、検索は正しく実行されているようですが、どのようにしてアイテムを取得できますか?
//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);
}
同じ問題のデバッグ中にこの古い投稿を見つけました。他の人もそれを打った場合に備えて私の修正を追加します。
サンプルコードを使用して遭遇した問題は次の行です。
// Do paging.
$query->range(20, 10);
私のデータベースにはレコードが少ししかなかったので、20件以上のレコードはなく、合計数は正しかったのですが、そこまでページングすることはできませんでした。
に更新しています:
// Do paging.
$query->range(0, 10);
私の問題を修正しました。
反復して取得する必要があります。ここに私がそれをした一つの方法があります:
$results = $query->execute();
$output = '';
foreach ($results as $result) {
$value = $result->getField('fieldname')->getValues();
$output .= $value[0];
}