我有一個Symfony項目,我使用Zend Lucene搜索框架在網站上集成搜索。它工作得很好,但它僅限於搜索1個表格。Symfony Zend Lucene搜索多個表
我需要我的用戶能夠搜索整個站點(8個選擇表)並將結果一起返回。每個表都具有相同的索引字段。這是指定表並調用查詢的代碼。
有沒有一種方法可以讓所有8個表格查找結果?
public function getForLuceneQuery($query)
{
$hits = self::getLuceneIndex()->find($query);
$pks = array();
foreach ($hits as $hit)
{
$pks[] = $hit->pk;
}
if (empty($pks))
{
return array();
}
$alltables = Doctrine_Core::getTable('Car');
$q = $alltables->createQuery('j')
->whereIn('j.token', $pks)
->orderBy('j.endtime ASC')
->andwhere('j.endtime > ?', date('Y-m-d H:i:s', time()))
->andWhere('j.activated = ?', '1')
->limit(21);
return $q->execute();
}
舉個位上的8臺的背景,他們都基本相似。他們都有標題,製作,模型等,所以我需要對它們全部運行一個查詢,並按升序返回所有結果(不管它在哪個表中)。 Doctrine_core :: getTable命令似乎不喜歡多個表或甚至數組(除非我沒有做對)。謝謝!
更新(工作):
這裏是更新的代碼。這是我在SearchTable.class.php
文件:
public function getForLuceneQuery($query)
{
// sort search result by end time
$hits = self::getLuceneIndex()->find(
$query, 'endtime', SORT_NUMERIC, SORT_ASC
);
$result = array(
'index' => $hits,
'database' => array(),
);
// group search result by class
foreach ($hits as $hit)
{
if (!isset($result['database'][$hit->class]))
{
$result['database'][$hit->class] = array();
}
$result['database'][$hit->class][] = $hit->pk;
}
// replace primary keys with real results
foreach ($result['database'] as $class => $pks)
{
$result['database'][$class] = Doctrine_Query::create()
// important to INDEXBY the same field as $hit->pk
->from($class . ' j INDEXBY j.token')
->whereIn('j.token', $pks)
->orderBy('j.endtime ASC')
->andwhere('j.endtime > ?', date('Y-m-d H:i:s', time()))
->andWhere('j.activated = ?', '1')
->limit(21)
->execute();
}
return $result;
}
以下是我在actions.class.php
文件的搜索模塊:
public function executeIndex(sfWebRequest $request)
{
$this->forwardUnless($query = $request->getParameter('query'), 'home', 'index');
$this->results = Doctrine_Core::getTable('Search')
->getForLuceneQuery($query);
}
最後,這是我的模板文件indexSuccess.php
我已經簡化它所以它更容易理解。我的indexSuccess.php
比較複雜,但現在我可以調用這些值,我可以進一步對其進行自定義。
<div class="product_list"
<ul>
<?php foreach ($results['index'] as $hit): ?>
<li class="item">
<?php if (isset($results['database'][$hit->class][$hit->pk])) ?>
<span class="title">
<?php echo $results['database'][$hit->class][$hit->pk]->getTitle() ?>
</span>
</li>
<?php endforeach ?>
</ul>
</div>
這工作很好。我可以通過調用搜索結果中的每個字段來定製它,並且它非常完美。我爲每個具有相同標題的表添加了一個項目,並且搜索結果將它們全部拉出。非常感謝!
我認爲這不能用1個查詢來完成。您應該將模型類名稱存儲在索引中,然後在搜索之後,可以將匹配的主鍵組合到像array('model class name'=> array(pk))這樣的數組中,並對每個匹配的表執行查詢。在查詢索引和顯示結果時可以進行排序。您可以迭代原始結果集並從查詢結果中選擇適當的記錄。但我不知道如何分頁。或者,您可以將所有需要顯示的數據存儲在索引中,並僅使用該數據而不查詢數據庫。 – 1ed 2012-07-30 21:38:48
我可以執行多個查詢(每個表上有一個查詢),然後加入結果,按升序對它們進行排序,然後顯示它們?我不確定這個代碼會是什麼樣子。對不起,我對Symfony有點新鮮。謝謝。 – djcloud23 2012-07-31 05:09:30
當然,您可以將結果縮短爲一個「Doctrine_Collection」,但我認爲這會造成太大的開銷。我剛剛發佈了我以前的想法作爲答案,並添加了一些代碼。 – 1ed 2012-07-31 21:46:50