アプリケーションで検索を設定しましたが、1 対多の方法で関連するプロパティにインデックスを付けるように拡張したいと考えています。たとえば、1 人が複数のユーザー名を持つことができるため、次の例のように、ユーザー名を分けておく必要があります。
person:
id: ~
name: {type: varchar(100), required: true}
username:
person_id: {type: integer, foreignTable: person, foreignReference: id}
username: {type: varchar(20), primaryKey: true, required: true}
ここまでは、アプリケーション内で Zend Lucene を使用するためにJobeet の例に従ってきました。また、Name など、Person 内の名前のプロパティを検索できます。
Symfony または Lucene を介してこれを自動的に行う方法が見つからなかったので、次のように Person のインデックスに項目を追加しようとしました。
foreach ($this->getUsernames() as $i => $username)
{
$doc->addField(Zend_Search_Lucene_Field::Text('username' . $i,
$username->getUsername(), 'utf-8'));
}
次に、ユーザー名の保存機能を更新して、新しいユーザー名が追加されるたびに、このインデックスを更新しようとしました。
public function save(PropelPDO $con = null)
{
$ret = parent::save($con);
// reindex the person
$person = $this->getPerson();
$person->save();
return $ret;
}
これは実行時に人物が作成されている限り問題なく動作しますが、フィクスチャからロードされた場合getUsernames()
は何も返しません。コードは 2 回実行されます (Person のロード中に 1 回、ユーザー名の追加時に 1 回)。これには何か理由がありますか?どうにかしてこれを回避できますか?
これを行う別の方法も高く評価されます。この質問で説明されているように、Lucene は Zend_Lucene_Search_Interface_MultiSearcher クラスを使用して複数のインデックスを検索できるようです。しかし、私はこれを機能させることができないようです。
ここで同様の質問を見つけましたが、ポインターは見つかりませんでした。
現在 Propel 1.6 を使用しています。