ES|QLからPHPオブジェクトへ
PHP で ES|QL クエリを実行および管理する方法を学びます。ES|QL の結果を PHP オブジェクトまたはカスタム クラスにマップするには、このガイドに従ってください。
elasticsearch-php v8.13.0以降では、 ES|QLクエリを実行し、結果をstdClassの PHP オブジェクトまたはカスタム クラスにマップできます。
ES|QL
ES|QLは、Elasticsearch 8.11.0 で導入された新しい Elasticsearch クエリ言語です。現在、テクニカル プレビューで利用可能です。Elasticsearch に保存されているデータをフィルタリング、変換、分析するための強力な方法を提供します。
「パイプ」( | )を使用して、データを段階的に操作および変換します。このアプローチにより、ユーザーは一連の操作を構成でき、1 つの操作の出力が次の操作の入力となり、複雑なデータ変換と分析が可能になります。
たとえば、次のクエリは、 sample_dataインデックスの最初の 3 つのドキュメント (行) を返します。
FROM sample_data
| LIMIT 3
ユースケース: 公式 PHP クライアントの ES|QL 機能
公式 PHP クライアントで開発された ES|QL 機能を説明するために、次の情報を含む 81,828 冊の書籍 (54.4 MB) のCSV ファイルをElasticsearch に保存しました。
Title;Descrition;Author;Year;Publisher;Ratingsこのリストは、公開されているAmazon Books Reviews データセットから抽出しました。
次の Elasticsearch マッピングを使用してbooksインデックスを作成しました:
'mappings' : {
'properties': {
'title': {
'type': 'text'
},
'description': {
'type': 'text'
},
'author': {
'type': 'text'
},
'year': {
'type': 'short'
},
'publisher': {
'type': 'keyword'
},
'rating': {
'type': 'half_float'
}
}
}rating値は、2.9 GB のBooks_rating.csvファイルから取得されたランキングレビューの平均です。
ここでは、 Elasticsearch にすべての書籍を一括インポートするために使用した PHP スクリプトを見つけることができます。一括操作には PHP 8.2.17 を使用して 7 秒と 28 MB の RAM が必要でした。提案されたマッピングでは、Elasticsearch のインデックス サイズは約 62 MB になります。
ES|QL の結果を PHP オブジェクトまたはカスタム クラスにマッピングする
esql()->query()エンドポイントを使用して、PHP で ES|QL クエリを実行できます。このクエリの結果はテーブル データ構造になります。これは、 columnsフィールドとvaluesフィールドを使用して JSON で表現されます。columnsフィールドにはnameとtype定義があります。
以下は、ユーザーのランキングレビュー順に並べられた、Stephen King が書いたトップ 10 の本を取得する ES|QL クエリの例です。
$query = <<<EOD
FROM books
| WHERE author == "Stephen King"
| SORT rating DESC
| LIMIT 10
EOD;
$result = $client->esql()->query([
'body' => ['query' => $query]
]);Elasticsearch からの JSON 結果は次のようになります。
{
"columns": [
{ "name": "author", "type": "text" },
{ "name": "description", "type": "text" },
{ "name": "publisher", "type": "keyword" },
{ "name": "rating", "type": "double" },
{ "name": "title", "type": "text" },
{ "name": "year", "type": "integer" }
],
"values": [
[
"Stephen King",
"The author ...",
"Turtleback",
5.0,
"How writers write",
2002
],
[
"Stephen King",
"In Blockade Billy, a retired coach...",
"Simon and Schuster",
5.0,
"Blockade",
2010
],
[
"Stephen King",
"A chilling collection of twenty horror stories.",
"Signet Book",
4.55859375,
"Night Shift (Signet)",
1979
],
...
]
}この例では、書籍に関連する 6 つのプロパティ (著者、説明、出版社、評価、タイトル、年) と 10 件の結果 (すべて Stephen King の書籍) があります。
ES|QL でサポートされているすべてのタイプのリストはここに記載されています。
$result応答オブジェクトには、配列、文字列、またはオブジェクトとしてアクセスできます (詳細については、ここを参照してください)。
オブジェクト インターフェイスを使用すると、プロパティとインデックスを使用して値にアクセスできます。たとえば、 $result->values[0][4]リストの最初の本 (0) のタイトル (4) を返し、 $result->values[1][3] 2 番目の本 (1) のランク スコア (3) を返します。PHP の配列のインデックスは 0 から始まることに注意してください。
このインターフェースは、いくつかのユースケースでは十分ですが、ほとんどの場合、結果としてオブジェクトの配列を取得したいと考えます。
結果をオブジェクトの配列にマップするには、elasticsearch-php の新しいmapTo()機能を使用できます。
この関数は、 Elasticsearch レスポンス オブジェクトで直接使用できます。つまり、次のようにアクセスできます。
$books = $result->mapTo(); // Array of stdClass
foreach ($books as $book) {
printf(
"%s, %s, %d, Rating: %.2f\n",
$book->author,
$book->title,
$book->year,
$book->rating
);
}カスタム Book クラスがある場合は、次のようにそれを使用して結果をマップできます。
class Book
{
public string $author;
public string $title;
public string $description;
public int $year;
public float $rating;
}
$books = $result->mapTo(Book::class); // Array of Bookクラスに ES|QL 結果に含まれるプロパティに加えて他のプロパティがある場合も、これは同様に機能します。mapTo()関数は、ES|QL 結果の列として返されるプロパティのみを使用します。
この記事で報告されているすべての例は、ここからダウンロードできます。
よくあるご質問
ES|QLとは何ですか?
ES|QL は、Elasticsearch 8.11.0 で導入された Elasticsearch クエリ言語です。Elasticsearch に保存されているデータをフィルタリング、変換、分析するための強力な方法を提供します。




