ブログ

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
ES|QLはテーブルを生成する

ユースケース: 公式 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フィールドにはnametype定義があります。

以下は、ユーザーのランキングレビュー順に並べられた、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 に保存されているデータをフィルタリング、変換、分析するための強力な方法を提供します。

関連記事

LINQ to Elasticsearch ES|QL:C#を記述してElasticsearchをクエリ

Florian Bernd

ES|QL を使用した Elasticsearch 地理空間検索

Craig Taverner

スイススタイルのハッシュテーブルを使用したより高速なES|QL統計

Chris Hegarty

Google MCP Toolbox for DatabasesにElasticsearchサポートを導入

Enrico Zimuel

Kibana を使用して地理空間データを Elasticsearch に取り込み、ES|QL で使用できるようにする

Craig Taverner

最先端の検索体験を構築する準備はできましたか?

十分に高度な検索は 1 人の努力だけでは実現できません。Elasticsearch は、データ サイエンティスト、ML オペレーター、エンジニアなど、あなたと同じように検索に情熱を傾ける多くの人々によって支えられています。ぜひつながり、協力して、希望する結果が得られる魔法の検索エクスペリエンスを構築しましょう。

はじめましょう