Zend framework 使用Zend-Lucene索引相关实体

Zend framework 使用Zend-Lucene索引相关实体,zend-framework,symfony1,lucene,propel,zend-lucene,Zend Framework,Symfony1,Lucene,Propel,Zend Lucene,我已经在我的应用程序中设置了搜索,但希望将其扩展到以一对多的方式索引相关属性。例如,一个人可以有许多用户名,因此必须将它们分开,如下例所示: person: id: ~ name: {type: varchar(100), required: true} username: person_id: {type: integer, foreignTable: person, foreignReference: id} username: {type

我已经在我的应用程序中设置了搜索,但希望将其扩展到以一对多的方式索引相关属性。例如,一个人可以有许多用户名,因此必须将它们分开,如下例所示:

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的方法,并且我可以在Person中搜索name的属性,例如name

我无法通过Symfony或Lucene找到任何自动执行此操作的方法,因此我尝试在人员索引中添加以下项目:

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;
}
只要人员是在运行时创建的,这就可以正常工作,但是如果从fixture加载,
getUsernames()
不返回任何内容。代码执行两次(一次在加载Person时执行,一次在添加用户名时执行)。这有什么原因吗?我能绕开这件事吗

另一种方法也将不胜感激。Lucene似乎可以使用Zend_Lucene_search_Interface_MultiSearcher类搜索多个索引,如中所述。然而,我似乎无法让它工作

我发现了一个类似的问题,但没有找到任何提示


我现在使用的是Propel 1.6。

您没有指定要使用的Propel版本。看到您正在使用PDO,您很可能正在使用1.3+

如果用户名对象初始化正确,即:

<?php
$username = new Username();
$username->setUsername('foobar');
$username->setPerson($person);
$person的用户名列表将为空。当你打电话的时候

 $username->setPerson($person);
$username将被添加到$person的用户名列表中,这意味着调用$person->getUsernames()不会自动从数据库中获取用户名,因为该列表已经非空

所以您需要用用户名初始化$person。要么像

<?php
$person = PersonQuery::create()->joinWith('Person.Usernames')->filterById(123)->findOne();

非常感谢您的回复。不幸的是,我不知道如何将此应用于我的问题。我当前在Username.php中覆盖的唯一函数是
save()
,它当前看起来与我发布的完全相同。如果我自己不调用
$person->save()
,它根本不会。你是说应该这样吗?我应该将上述人员的初始化放在哪里?在用户名的
setPerson()
,或覆盖
doSave()
?Hmm。。看来我记错了这个行为。。在我的示例中,调用$username->setPerson($person);实际调用$person->addUsername($username);这实际上会初始化集合。至少在1.5以上。因此,对于初始化集合,您不必做任何特殊的操作。你的代码应该可以工作。用户名集合应在persons的保存方法中完全初始化。person的save方法仅在person实际被修改时才被调用,因此您必须手动调用,因为您正在这样做。您知道为什么用户名可能没有亲自初始化吗?
<?php
$person = PersonQuery::create()->joinWith('Person.Usernames')->filterById(123)->findOne();
<?php
$person = PersonPeer::retrieveByPk(123);
$person->getUsernames(); //trigger list fetch