サイトは、基準に一致する製品を返します
このサイトは、検索を微調整するためのリンクを提供します。たとえば、ルーターにはさまざまなブランドがあることを促す場合があり、さまざまな価格帯とさまざまな機能がある場合があります。
ユーザーは、提供されたさまざまなリンクをクリックして結果をさらにスクリーニングでき、最終的にはよりカスタマイズされた結果セットを取得できます。
以下の数行を追加して、index.phpから始めましょう:
デモアプリケーション(Silexを使用)でさらに2つのルートを作成しました。
最初のルートは、最初の検索動作に一致するすべてのレコード、つまりキーワードを提供して検索を示すすべてのレコードを表示するページに私たちを連れて行くことです。デモをシンプルに保つために、サンプルbook_bookテーブルからすべての本を選択します。また、さらにナビゲーションのための結果セットとファセットリンクも表示されます。
2番目のルートでは、上記のステップで作成された結果セットのさらにファセット検索基準に一致するレコードを示す別のページにもたらされます。ファセットの検索リンクも表示されます。現実世界の実装では、ファセットリンクがクリックされた後、結果ページのファセットフィルタリングは、結果データセットの統計情報を反映するように調整されます。これを行うことにより、ユーザーは「アドオン」上映を適用し、最初に「ブランド」を追加してから「価格帯」などを追加できます。
しかし、この単純なデモでは、このアプローチをスキップします。すべてのファセット検索とリンクは、元のデータセットの情報のみを反映します。これは最初の制限であり、デモの改善のための最初の領域です。
上記のコードからわかるように、実際の関数はpinqdemo.phpという別のファイルにあります。ファセット検索機能を提供する関連コードを見てみましょう。ファセットクラス
最初に、ファセットを表すクラスを作成します。一般的に、ファセットにはいくつかのプロパティが必要です:
それが動作するデータ($ data)
<span>$app->get('demo2', function () use ($app) </span><span>{ </span> <span>global $demo; </span> <span>$test2 = new pinqDemo<span>\Demo</span>($app); </span> <span>return $test2->test2($app, $demo->test1($app)); </span><span>} </span><span>); </span> <span>$app->get('demo2/facet/{key}/{value}', function ($key, $value) use ($app) </span><span>{ </span> <span>global $demo; </span> <span>$test3 = new pinqDemo<span>\Demo</span>($app); </span> <span>return $test3->test3($app, $demo->test1($app), $key, $value); </span><span>} </span><span>);</span>
ルートには2つのパラメーターがあり、ファセットのキーとそのキーの値を反映しています。最終的にそのルートから呼び出されるtest3関数は、以下の抜粋を次のようにしています。
基本的に、キーに応じて、渡された値に対応するフィルタリング(句の匿名関数)を適用し、さらにスクリーニングされたデータを取得します。ファセットデータの順序を指定することもできます。
最後に、テンプレートにデータ(ファセットとともに)を表示します。このルートは、ルート「Demo2」で使用されるテンプレートと同じテンプレートをレンダリングします。
<span>$app->get('demo2', function () use ($app) </span><span>{ </span> <span>global $demo; </span> <span>$test2 = new pinqDemo<span>\Demo</span>($app); </span> <span>return $test2->test2($app, $demo->test1($app)); </span><span>} </span><span>); </span> <span>$app->get('demo2/facet/{key}/{value}', function ($key, $value) use ($app) </span><span>{ </span> <span>global $demo; </span> <span>$test3 = new pinqDemo<span>\Demo</span>($app); </span> <span>return $test3->test3($app, $demo->test1($app), $key, $value); </span><span>} </span><span>);</span>
アプリによって生成されたファセットはネストされた配列であることを覚えておく必要があります。最初のレイヤーでは、すべてのファセットの配列であり、私たちの場合、合計3つ(著者、タイトル、著者の場合)があります。
各ファセットの場合、それは「キー価値」のペアな配列であり、従来の方法で反復することができます。
<span>namespace classFacet </span><span>{ </span> <span>use Pinq<span>\ITraversable</span>, </span> Pinq\Traversable<span>; </span> <span>class Facet </span> <span>{ </span> <span>public $data; // Original data </span> <span>public $key; // the field to be grouped on </span> <span>public $type; // F: full string; S: start of a string; R: range; </span> <span>public $range; // Only valid if $type is not F </span> <span>... </span> <span>public function getFacet() </span> <span>{ </span> <span>$filter = ''; </span> <span>if ($this->type == 'F') // Full string </span> <span>{ </span> <span>... </span> <span>} </span> <span>elseif ($this->type == "S") //Start of string </span> <span>{ </span> <span>... </span> <span>} </span> <span>elseif ($this->type == "R") // A value range </span> <span>{ </span> <span>$filter = $this->data </span> <span>->groupBy(function($row) </span> <span>{ </span> <span>return floor($row[$this->key] / $this->range) * $this->range; </span> <span>}) </span> <span>->select(function (ITraversable $data) </span> <span>{ </span> <span>return ['key' => $data->last()[$this->key], 'count' => $data->count()]; </span> <span>}); </span> <span>} </span> <span>return $filter; </span> <span>} </span> <span>} </span><span>}</span>
テンプレートは、以下に示すようにレンダリングされます:
(最初のエントリページは、$ 0から10ドル、著者が注文した価格のファセット結果を示しています)
大丈夫、これまでのところ、Webアプリのファセット検索機能を模倣することができました!
このシリーズを締めくくる前に、このデモを最後に見て、それを改善するために何ができるか、何が制限となっているかを確認します。
「アドオン」基準検索機能を提供することを検討する必要があります。現在の実装は、スクリーン型のデータではなく、元のみに適用されるファセット検索を制限します。これは私が考えることができる最も重要な改善です。
制限
毎回mysqlサーバーからデータを取得しています。
このアプリは、Silexをフレームワークとして使用します。 Silex、Symfony、Laravel、Index.php(またはapp.php)などの単一の突入フレームワークの場合、ルートを分析し、コントローラーの関数を呼び出すたびに呼び出されます。
index.phpのコードを見ると、これは以下のコードの行も意味することがわかります:
<span>$app->get('demo2', function () use ($app) </span><span>{ </span> <span>global $demo; </span> <span>$test2 = new pinqDemo<span>\Demo</span>($app); </span> <span>return $test2->test2($app, $demo->test1($app)); </span><span>} </span><span>); </span> <span>$app->get('demo2/facet/{key}/{value}', function ($key, $value) use ($app) </span><span>{ </span> <span>global $demo; </span> <span>$test3 = new pinqDemo<span>\Demo</span>($app); </span> <span>return $test3->test3($app, $demo->test1($app), $key, $value); </span><span>} </span><span>);</span>
フレームワークの使用を避ける方が良いでしょうか?まあ、フレームワークなしでアプリを開発することは本当にそれほど良い考えではないという事実に加えて、私たちはまだ同じ問題に直面しています。データ(およびステータス)は、HTTPコールから別の呼び出しまで永続的ではありません。これがHTTPの基本的な特性です。これは、キャッシュエンジンを使用することで避ける必要があります。
<span>namespace classFacet </span><span>{ </span> <span>use Pinq<span>\ITraversable</span>, </span> Pinq\Traversable<span>; </span> <span>class Facet </span> <span>{ </span> <span>public $data; // Original data </span> <span>public $key; // the field to be grouped on </span> <span>public $type; // F: full string; S: start of a string; R: range; </span> <span>public $range; // Only valid if $type is not F </span> <span>... </span> <span>public function getFacet() </span> <span>{ </span> <span>$filter = ''; </span> <span>if ($this->type == 'F') // Full string </span> <span>{ </span> <span>... </span> <span>} </span> <span>elseif ($this->type == "S") //Start of string </span> <span>{ </span> <span>... </span> <span>} </span> <span>elseif ($this->type == "R") // A value range </span> <span>{ </span> <span>$filter = $this->data </span> <span>->groupBy(function($row) </span> <span>{ </span> <span>return floor($row[$this->key] / $this->range) * $this->range; </span> <span>}) </span> <span>->select(function (ITraversable $data) </span> <span>{ </span> <span>return ['key' => $data->last()[$this->key], 'count' => $data->count()]; </span> <span>}); </span> <span>} </span> <span>return $filter; </span> <span>} </span> <span>} </span><span>}</span>
結論
この部分では、本のコレクションサイトのファセット検索機能を模倣することができました。私が言ったように、それは単なる缶のデモであり、改善の余地がたくさんあり、いくつかのデフォルトの制限があります。この例に基づいて構築し、さらに高度なユースケースを表示できる場合はお知らせください!
あなたのコメントや考えを下に残してください!
PINQとファセット検索に関するよくある質問(FAQ)PINQとは何ですか、それはファセット検索とどのように関係していますか?PINQは、配列やその他のデータセットを操作するためのユニークで直感的で強力なクエリ言語を提供するPHPライブラリです。データのクエリと操作のプロセスを簡素化するように設計されています。ファセット検索に関連して、PINQを使用して、ファセット検索のコア概念である複数の基準に基づいてデータをフィルタリングおよびソートできる複雑なクエリを作成できます。
ファセット検索に対するPINQのアプローチは、広く使用されているプログラミング言語であるPHPに基づくクエリ言語を使用するため、ユニークです。これにより、PHPにすでに精通している開発者がファセット検索を実装しやすくなります。さらに、PINQのクエリ言語は直感的で使いやすいように設計されており、複雑なクエリを作成するプロセスを簡素化できます。 > PINQはMySQLに限定されません。配列やその他のデータベースなど、任意のデータセットで使用できます。この柔軟性により、PINQはさまざまな種類のデータを操作する必要がある開発者にとって汎用性の高いツールになります。これは、怠zyな評価戦略を使用して行います。つまり、実際に必要な場合にのみデータを処理することを意味します。これにより、大規模なデータセットを操作するときにパフォーマンスが大幅に向上します。
検索結果の精度をどのように保証しますか?
PINQをリアルタイム検索に使用できますか?大規模なデータセットの効率的な取り扱いと複雑なクエリを作成する機能により、リアルタイム検索アプリケーションに適しています。
以上がPINQ-データセットを照会 - ファセット検索の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。