我们使用最初在Joomla开发的Concrete5构建了一个站点。我们的工作是将所有东西和Concrete5-ize结合起来。该网站的主要部分是大约1200个音频教学,每个教学都有各种属性,如主题,作者,程序,位置等。
某些教导可能会分配多个属性,例如多个关键字或主题。
我想对所有属性进行计数,以便访问者可以看到某位作者有多少教导,或者一目了然有多少是特定主题,即:
我的原始代码被无意中听到了太多的教导和许多属性的实用性。基本上,我浏览了每个属性,我根据PageList计数查找了总计数。我们正在讨论每个页面加载的数百个查找。打开缓存似乎没有帮助。
是否有其他策略已经证明可以成功聚合大量页面上的属性计数?
以下是供参考的网站:http://everydayzen.org/teachings/
答案 0 :(得分:1)
我通常说“不要直接访问数据库;使用API”,但我认为你应该在这里使用数据库。
查看[Collection|File]SearchIndexAttributes
表格。 (我不确定教学是文件还是页面。如果是页面,你需要通过仪表板中的作业定期重新索引它们。)查看索引表比加入最近的表要容易得多属性值表中的版本。一旦看到该表,就可以在SQL中进行一些简单的GROUPing。
如果您想使用API,您可以像今天一样批处理,进行适当的计算,然后缓存它。
没有理由缓存不起作用,但第一次点击(当缓存是冷的时候)将花费全部时间。你应该缓存我的IndexAttributes想法(一个完整的表读取和循环并不简单),但至少有一个冷缓存应该花费几分之一秒,而数百个页面列表调用可能需要10秒或更长时间。
答案 1 :(得分:1)
我在Concrete5的工作现场做了类似的事情,通过显示每个部门的工作数量来计算。
即。人力资源(32),销售(12)等等
这是从助手那里获得的代码(这只是包含的相关功能):
<?php
class JobHelper {
/**
* GetDepartmentJobsCount
* Returns array of Department names with job count based on input Pages
* @param Array(Pages) - Result of a PageList->getPages
* @return Array
*/
public function getDepartmentJobsCount($pages) {
$depts = $this->getDepartments();
$cj = $this->setCounts($depts);
$cj = $this->setAttributeCounts($cj, $pages,'job_department');
return $cj;
}
/**
* GetDepartments
* Return all available Departments
* @return Array(Page)
*/
public function getDepartmentPages(){
$pld = new PageList();
$pld->filterByPath('/working-lv'); //the path that your Teachings all sit under
$pld->setItemsPerPage(0);
$res = $this->getPage();
$depts = array();
foreach($res as $jp){
$depts[$jp->getCollectionName()] = $jp;
}
ksort($depts);
return $depts;
}
/**
* PopulateCounts
* Returns array of page names and counts
* @param Array - Array to feed from
* @return Array
*/
public function setCounts($v){
foreach($v as $w){
$a[$w]['count'] = 0;
}
return $a;
}
/**
* PopulateCounts
* Returns array of page names, with counts added from attribute, and paths
* @param Array - Array to add counts and paths in to
* @param Array(Pages) - Pages to run through
* @param String - Attribute to also add to counts
* @param String - Optional - Job Search parameter, leave blank to get Page URL
* @return Array
*/
public function setAttributeCounts($cj, $pages, $attr){
foreach($pages as $p) {
$pLoc = explode('|',$p->getAttribute($attr)); // Our pages could have multiple departments pipe separated
foreach($pLoc as $locName){
$cj[$locName]['count']++;
}
}
return $cj;
}
然后,您可以从PageList模板
执行以下操作$jh = Loader::helper('job');
$deptCounts = $jh->getDepartmentJobsCount($pages);
foreach($deptCounts as $dept => $data) {
echo $dept . '(' . $data['count] . ')';
}