質問
さまざまな ORM での検索の処理に関する情報を探しています。
現在、私は PHP で古いアプリケーションを再開発しています。要件の 1 つは次のとおりです。すべてまたはほぼすべてを検索可能にするため、ユーザーは「パンクロック ライブ」と入力するだけで、アプリはビデオ クリップ、音楽トラック、レビュー、今後のイベント、さらにはそのようにラベル付けされたユーザー コメントを検索します。
すべてが検索可能な環境では、ORM は次の 2 つの方法でこの機能をサポートする必要があります。
- ORM の「O」側にインデックス API を提供する
- 「R」側でデータベースを一括検索する手段を提供します。
理想的なソリューションは、検索された文字列に基づいて既製のオブジェクトを返すことです。必ずしも PHP でなくても、その役割を果たす優れたエンドツーエンドのソリューションをご存知ですか?同様の問題に対処した場合は、あなたの経験を聞いてみるのもいいでしょう。以上のもの Lucene を使用する または セマンティックウェブがその方法です ワンライナーですけど ;-)*
解決
最近統合しました 方位磁針 検索エンジンを Java EE 5 アプリケーションに組み込みます。に基づいています ルシーン・ジャワ さまざまな ORM フレームワークだけでなく、XML などの他のタイプのモデルもサポートしていますが、実際のモデルはまったくサポートしていません ;)
ORM フレームワークによって管理されるオブジェクト モデルの場合、クラスに特別なアノテーション (例:@Searchable) を使用してクラスを登録し、アプリケーションの起動時に Compass がそれらのインデックスを作成し、モデルへの変更を自動的にリッスンできるようにします。
検索に関しては、Lucene の力が手に入ります。Compass は、検索結果としてモデル オブジェクトのインスタンスを提供します。
これは PHP ではありませんが、必ずしも PHP である必要はないと言っていました ;) ただし、これが役立つかどうかはわかりません...
他のヒント
Propel 1.3 schema.xml ファイルでは、すべてのモデルが自分で作成した「BaseModel」クラスを拡張するように指定できます。
その BaseModel で、save() メソッドを次のように再定義します。
public function save(PropelPDO $con = null)
{
if($this->getIsSearchable())
{
// update your search index here. Lucene, Sphinx, or otherwise
}
return parent::save($conn);
}
これにより、すべてのインデックスが維持されます。検索に関しては、いくつかのメソッドを含む Search クラスを作成することをお勧めします。
class Search
{
protected $_searchableTypes = array('music','video','blog');
public method findAll($search_term)
{
$results = array();
foreach($this->_searchableTypes as $type)
{
$results[] = $this->findType($type, $search_term);
}
return $results;
}
}