TYPO3 11.5查询index_stat_word表返回空,无法展示Top4搜索词求助
以下是针对你代码的问题排查和修正方案:
1. Fluid模板变量名不匹配(直接导致无内容显示)
控制器中传递的变量名是mostSearchedWords,但模板里循环的变量是mostPopularWords,变量名完全不一致,这是最直接的显示问题。
修正模板文件(ext\my_site_package\Resources\Private\Partials\IndexedSearch\Form.html):
<ul class="popular-words"> <f:for each="{mostSearchedWords}" as="word"> <li>{word.word} - {word.word_count}</li> </f:for> </ul>
2. 控制器Action方法参数错误
Extbase的Action方法不需要手动接收RenderingContextInterface,这种写法不符合规范,会导致Action无法正常触发或变量赋值失效。
修正控制器类(ext\my_site_package\Classes\Controller\MostSearchedController.php):
<?php declare(strict_types=1); namespace Vendor\MySitePackage\Controller; use Vendor\MySitePackage\Domain\Repository\MostSearchedRepository; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; class MostSearchedController extends ActionController { protected MostSearchedRepository $mostSearchedRepository; public function __construct(MostSearchedRepository $mostSearchedRepository) { $this->mostSearchedRepository = $mostSearchedRepository; } /** * Action to display most searched words * * @return void */ public function showMostSearchedWordsAction() { $mostSearchedWords = $this->mostSearchedRepository->findMostUsedWords(); // 使用Extbase标准的变量赋值方式 $this->view->assign('mostSearchedWords', $mostSearchedWords); } }
3. 数据库查询逻辑错误
index_stat_word表的每条记录对应一次搜索中的单个关键词,同一个搜索(对应stat_uid)可能包含多个关键词。原代码用COUNT(word)统计的是关键词在所有搜索记录中的出现次数,而非被搜索的独立请求次数,且未过滤空关键词。更合理的统计是统计每个关键词被多少不同的搜索请求使用(即统计唯一的stat_uid数量)。
另外,index_stat_word表默认没有deleted字段,原代码添加的DeletedRestriction是无效限制,应移除。
修正仓库类(ext\my_site_package\Classes\Domain\Repository\MostSearchedRepository.php):
<?php declare(strict_types=1); namespace Vendor\MySitePackage\Domain\Repository; use TYPO3\CMS\Core\Database\ConnectionPool; final class MostSearchedRepository { private ConnectionPool $connectionPool; private const TABLE_NAME = 'index_stat_word'; public function __construct(ConnectionPool $connectionPool) { $this->connectionPool = $connectionPool; } public function findMostUsedWords(int $limit = 4): array { $queryBuilder = $this->connectionPool ->getQueryBuilderForTable(self::TABLE_NAME); // 移除无效的DeletedRestriction $queryBuilder->getRestrictions()->removeAll(); $queryBuilder ->select('word', 'COUNT(DISTINCT stat_uid) AS word_count') ->from(self::TABLE_NAME) // 过滤空关键词 ->where($queryBuilder->expr()->isNotNull('word')) ->andWhere($queryBuilder->expr()->neq('word', $queryBuilder->createNamedParameter(''))) ->groupBy('word') ->orderBy('word_count', 'DESC') ->setMaxResults($limit); return $queryBuilder->executeQuery()->fetchAllAssociative(); } }
4. 依赖注入配置检查
确保站点包中已正确配置依赖注入,在ext\my_site_package\Configuration\Services.yaml中添加以下内容:
services: _defaults: autowire: true autoconfigure: true public: false Vendor\MySitePackage\: resource: '../Classes/*' Vendor\MySitePackage\Domain\Repository\MostSearchedRepository: arguments: $connectionPool: '@TYPO3\CMS\Core\Database\ConnectionPool'
5. 确认indexed_search统计功能已开启
如果以上修正后仍无数据,检查indexed_search的扩展配置:
- 进入TYPO3后端 → 扩展管理 → 找到
indexed_search→ 点击"配置" - 确保Enable statistics和Store search words选项已勾选
- 确认已有用户执行过搜索操作(统计数据需要用户实际搜索后才会生成)
内容的提问来源于stack exchange,提问作者Dmitriy

