web-dev-qa-db-ja.com

プログラムによる検索APIの使用

私は読んで試しました 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');すべての場合で、カウントは正しいようです。したがって、検索は正しく実行されているようですが、どのようにしてアイテムを取得できますか?

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

同じ問題のデバッグ中にこの古い投稿を見つけました。他の人もそれを打った場合に備えて私の修正を追加します。

サンプルコードを使用して遭遇した問題は次の行です。

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

私のデータベースにはレコードが少ししかなかったので、20件以上のレコードはなく、合計数は正しかったのですが、そこまでページングすることはできませんでした。

に更新しています:

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

私の問題を修正しました。

1
Mubashar Iqbal

反復して取得する必要があります。ここに私がそれをした一つの方法があります:

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

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