You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3 11.5查询index_stat_word表返回空,无法展示Top4搜索词求助

排查TYPO3 11.5中indexed_search热门关键词查询为空的问题

以下是针对你代码的问题排查和修正方案:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:27:04