LikeShop 搜索功能优化二开:中文分词、商品权重排序与搜索热词管理

1.1 原生搜索实现方式

LikeShop 的搜索逻辑集中在 app/api/logic/SearchLogic.php 中,核心实现为 hotLIsts()方法,用于返回热搜列表数据:

复制代码
public static function hotLists()
{
    $data = HotSearch::field(['name', 'sort'])
        ->order(['sort' => 'desc', 'id' => 'desc'])
        ->select()->toArray();
return [
        'status' => ConfigService::get('hot_search', 'status', 0),
        'data' => $data,
   ];
}

热词数据存储在 HotSearch 模型对应的数据表中,字段仅包含 name(热词名称)和 sort(排序值),由后台手动维护。

商品搜索接口 /goods/search 的核心参数为:keyword(搜索关键词)、sort(排序值,volume-销量从高到低,xinpin-新品);搜索条件的组装依赖 ListsSearchInterface 接口,通过 setSearch() 方法定义查询条件,使用 %like% 操作符实现模糊匹配:

复制代码
 public function setSearch(): array
{
      return [
          '=' => ['type', 'cid'],
          '%like%' => ['title']
    ];
}      

1.2 原生搜索体系的四个核心缺口

缺口一:搜索匹配精度低。%like% 模糊匹配是子字符串匹配,搜索"红色连衣裙"时只能匹配标题中完整包含字符串的商品;如果商品标题是"女士连衣裙红色",则无法被命中;中文没有天然分词边界,模糊匹配无法解决"词序不一致""同义词"等场景。

缺口二:排序维度单一。原生仅支持按销量和新品排序,没有综合排序(按相关性+权重打分),也没有价格升降序、收藏量、转化率等多维度排序;电商平台中,搜索排序并非单一指标决定,而是由系统综合判断商品竞争力、相关性与用户体验表现。

缺口三:热词管理能力薄弱。HotSearch 表仅有 name 和 sort 两个字段,不支持热词的自动采、搜索频次统计、时间窗口衰减等运营能力;热词完全依赖人工维护,无法反映真实的用户搜索趋势。

缺口四:无搜索日志与无结构兜底。系统不记录用户的搜索行为,无法分析搜索词分布和转化漏斗;搜索无结果时直接返回空列表,没有智能推荐替代商品的能力。

1.3 二开策略定位

遵循 LikeShop 的"扩展优先"原则,搜索优化采用以下策略:

  1. 不修改 SearchLogic.php 的原生方法,新建独立的 SearchEngineService 作为搜索核心
  2. 引入轻量分词引擎,对商品标题进行预分词并建立倒排索引,替换 %like% 模糊匹配
  3. 新增搜索日志表和热词统计表,通过定时任务自动采集和更新热词
  4. 搜索排序采用多因子加权打分模型,后台可配置各因子的权重系数

二、中文分词方案选型与集成

2.1 方案对比

方案 原理 优点 缺点 适用场景
SCWS C 扩展,基于词频词典 性能高,准确率 90%-95% 需编译安装 PHP 扩展 服务器有编译权限
PSCWS4 纯 PHP 实现 SCWS 功能 无需扩展,composer 安装 性能略低于 C 扩展 虚拟主机/共享服务器
WindSearch 纯 PHP 全文检索引擎 零依赖,内置 20 万+词库 相对较新,生态较小 中小规模数据
MySQL FULLTEXT 数据库原生全文索引 无需额外组件 中文分词支持差 不推荐中文场景

SCWS(Simple Chinese Word Segmentation)是基于词频词典的机械式中文分词引擎,采用纯 C 语言开发,不依赖任何外部库函数,提供了 PHP 扩展模块,测试准确率在 90% ~ 95% 之间;WindSearch 则是一个纯 PHP 开发的全网检索引擎,内置中文分词程序,比数据库 LIKE 快 300 倍,比 ES 轻量 90%,天然适配 Laravel/ThinkPHP 等主流框架。

选型建议:如果服务器有编译权限,优先选择 SCWS 的 PHP 扩展方案,性能最优;如果是虚拟主机或不想维护扩展,选择 WindSearch,它提供了与 ThinkPHP 天然集成的能力,且支持 「全文搜索」「同义词扩展」「字段权重优化」等功能。

2.2 SCWS 方案集成步骤

第一步:安装 SCWS PHP 扩展

复制代码
# 下载源码并编译
wget -q -O - http://www.xunsearch.com/scws/down/scws-   1.2.1.tar.bz2 | tar xjf -
cd scws-1.2.1
./configure
make install

# 编译 PHP 扩展
cd phpext/
phpize
./configure --with-scws=/usr/local --with-php-config=$(which php-config)
make && sudo make install

# 在 php.ini 中加载扩展
extension = scws.so
scws.default.charset = utf8
scws.default.fpath = /usr/local/etc

Windows 系统则直接下载编译好的 php_scws.dll 并配置即可。

第二步:封装分词服务

复制代码
class SegmentService
{
private $scws;

public function __construct()
{
    $this->scws = scws_new();
    $this->scws->set_charset('utf8');
    // 加载自定义词典(商品品类词、品牌词)
    $this->scws->add_dict(ROOT_PATH . 'extend/dict/goods_dict.xdb', SCWS_XDICT_XDB);
    // 设置分词模式:15 = 短词 + 重要单字
    $this->scws->set_duality(true);
}

/**
 * 对文本进行分词
 */
public function cut(string $text, int $top = 0): array
{
    $this->scws->send_text($text);
    $words = [];
    while ($result = $this->scws->get_result()) {
        foreach ($result as $item) {
            // 过滤停用词和单字
            if (mb_strlen($item['word']) < 2) continue;
            if (StopWordService::isStopWord($item['word'])) continue;
            $words[] = [
                'word'   => $item['word'],
                'weight' => $item['attr'] === 'n' ? 2 : 1, // 名词权重更高
            ];
        }
    }
    // 按词频降序,返回topN
    usort($words, fn($a, $b) => $b['weight'] - $a['weight']);
    return $top > 0 ? array_slice($words, 0, $top) : $words;
}

public function __destruct()
{
    $this->scws->close();
  }
}

2.3 商品分词索引构建

新增商品搜索索引表,存储商品标题的分词结果,加速检索:

复制代码
CREATE TABLE `ls_goods_search_index` (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `goods_id` int UNSIGNED NOT NULL COMMENT '商品ID',
  `word` varchar(30) NOT NULL COMMENT '分词结果',
  `word_weight` tinyint NOT NULL DEFAULT 1 COMMENT '词权重:1-普通词,2-核心词',
  `position` tinyint NOT NULL DEFAULT 0 COMMENT '词在标题中的位置,0为开头',
  `create_time` int UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `idx_word_goods` (`word`, `goods_id`),
  KEY `idx_goods_id` (`goods_id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品搜索分词索引表';

商品上架或标题修改时,通过事件机制触发索引重建:

复制代码
 class GoodsSearchIndexService
 {
     public function rebuildIndex($goodsId)
     {
        $goods = GoodsModel::find($goodsId);
        if (!$goods || $goods['del'] != 0) return;

        // 清除旧索引
        GoodsSearchIndexModel::where('goods_id', $goodsId)->delete();

        // 分词:标题权重最高,副标题和关键词次之
        $segment = new SegmentService();
        $words = $segment->cut($goods['name']);

        foreach ($words as $pos => $item) {
            GoodsSearchIndexModel::create([
                'goods_id'    => $goodsId,
                'word'        => $item['word'],
                'word_weight' => $item['weight'] * ($pos < 3 ? 2 : 1), // 开头词加权
                'position'    => $pos,
                'create_time' => time(),
              ]);
            }
         }
    }

2.4 搜索查询改造

将原生的 %like% 模糊匹配替换为基于分词索引的精确检索:

复制代码
class SearchEngineService
{
    /**
    * 基于分词索引的商品搜索
    */
    public function search($keyword, $page = 1, $size = 20)
    {
         $segment = new SegmentService();
         $keywords = $segment->cut($keyword, 5); // 取权重最高的5个词

         if (empty($keywords)) {
            return ['list' => [], 'total' => 0];
         }

          // 构建匹配条件:任一关键词命中即可
          $goodsIds = GoodsSearchIndexModel::where(function ($query) use ($keywords) {
          foreach ($keywords as $kw) {
              $query->whereOr('word', 'like', $kw['word'] . '%');
          }
           })->group('goods_id')
           ->order('sum(word_weight)', 'desc')
           ->limit(500) // 限制候选集大小
           ->column('goods_id');

          // 查询商品详情并按权重排序
          $list = GoodsModel::whereIn('id', $goodsIds)
               ->where('status', 1)->where('del', 0)
               ->page($page, $size)
               ->select();

           return ['list' => $list, 'total' => count($goodsIds)];
      }
 }

2.5 拼音搜索扩展

用户在搜索时经常输入拼音(如"lianyiqun"搜索"连衣裙"),实现拼音搜索需要在商品标题分词时同步生成拼音索引:

复制代码
 // 使用 overtrue/pinyin 生成拼音索引
 use Overtrue\Pinyin\Pinyin;

 class PinyinIndexService
 {
     public function buildPinyinIndex($goodsId, $title)
     {
         $pinyin = new Pinyin();
         $fullPinyin = str_replace(' ', '', $pinyin->permalink($title));
         $firstLetters = str_replace(' ', '', $pinyin->abbr($title));

         PinyinIndexModel::create([
            'goods_id'       => $goodsId,
            'full_pinyin'    => $fullPinyin,
            'first_letters'  => $firstLetters,
         ]);
      }
 }

搜索时同时匹配中文分词索引和拼音索引,取并集结果。

三、商品权重排序模型

3.1 多因子加权打分模型

搜索结果排序采用多因子加权打分;参考电商搜索权重体系,核心因子包括:商品竞争力(销量、转化率)、用户体验(评分、退货率)、相关性(关键词匹配度)、商业化投入(付费推广)等维度;结合 LikeShop 的商品数据特点,设计以下打分模型:

Score=W1​⋅Srelevance​+W2​⋅Ssales​+W3​⋅Srate​+W4​⋅Sfresh​+W5​⋅Scollect​

因子 计算方式 默认权重
相关性 命中词权重之和 / 标题总词权重 40%
销量 log(销量+1) / log(最大销量+1) 25%
评分 商品评分 / 5 15%
新品 上架 30 天内得满分,线性衰减 10%
收藏量 log(收藏量+1) / log(最大收藏量+1) 10%

3.2 权重配置表

复制代码
CREATE TABLE `ls_search_weight_config` (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `factor_key` varchar(30) NOT NULL COMMENT '因子标识:relevance/sales/rate/fresh/collect',
  `factor_name` varchar(50) NOT NULL COMMENT '因子名称',
  `weight` decimal(5,2) NOT NULL DEFAULT 0.00 COMMENT '权重系数(0-1之间)',
  `is_enable` tinyint NOT NULL DEFAULT 1,
  `update_time` int UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_factor_key` (`factor_key`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='搜索权重配置表';

3.3 打分排序实现

复制代码
  class GoodsRankService
  {
     public function rank($goodsList, $keywords)
     {
        $weights = SearchWeightConfigModel::where('is_enable', 1)
           ->column('weight', 'factor_key');

         // 获取最大销量和最大收藏量用于归一化
         $maxSales = GoodsModel::where('status', 1)->max('sales');
         $maxCollect = GoodsModel::where('status', 1)->max('collect_count');

         foreach ($goodsList as &$goods) {
            // 相关性得分:命中关键词的权重占比
            $relevanceScore = $this->calcRelevance($goods['id'], $keywords);

            // 销量得分:对数归一化
            $salesScore = $maxSales > 0
                ? log($goods['sales'] + 1) / log($maxSales + 1) : 0;

             // 评分得分
             $rateScore = $goods['goods_rate'] / 5;

             // 新品得分:30天内满分,之后线性衰减至0(90天)
             $daysSinceShelf = (time() - $goods['create_time']) / 86400;
             $freshScore = max(0, min(1, (90 - $daysSinceShelf) / 60));

             // 收藏量得分
             $collectScore = $maxCollect > 0
                ? log($goods['collect_count'] + 1) / log($maxCollect + 1) : 0;

             $goods['search_score'] = round(
                ($weights['relevance'] ?? 0.4) * $relevanceScore +
                ($weights['sales'] ?? 0.25) * $salesScore +
                ($weights['rate'] ?? 0.15) * $rateScore +
                ($weights['fresh'] ?? 0.1) * $freshScore +
                ($weights['collect'] ?? 0.1) * $collectScore,
              4);
           }

             // 按得分降序排列
             usort($goodsList, fn($a, $b) => $b['search_score'] - $a['search_score']);
             return $goodsList;
     }

          private function calcRelevance($goodsId, $keywords)
          {
             $totalWeight = GoodsSearchIndexModel::where('goods_id', $goodsId)
                ->sum('word_weight');
            if ($totalWeight <= 0) return 0;

            $matchedWeight = GoodsSearchIndexModel::where('goods_id', $goodsId)
               ->where(function ($query) use ($keywords) {
                   foreach ($keywords as $kw) {
                        $query->whereOr('word', $kw['word']);
                   }
             })
             ->sum('word_weight');

        return $matchedWeight / $totalWeight;
    }
}

3.4 后台配置

在"系统配置 → 搜索设置"中增加权重配置区块:

配置项 类型 默认值 说明
相关性权重 滑块(0-1) 0.40 关键词匹配度的权重
销量权重 滑块(0-1) 0.25 商品销量的权重
评分权重 滑块(0-1) 0.15 商品评分的权重
新品权重 滑块(0-1) 0.10 新品上架的权重
收藏权重 滑块(0-1) 0.10 商品收藏量的权重

各权重之和必须等于 1.0 ,后台保存时做校验;同时,前台搜索结果的排序下拉框中增加"综合排序"选项,对应加权打分排序;原有的"销量""价格""新品"排序保留不变。

四、搜索热词管理

4.1 搜索日志采集

新增搜索日志表,记录每一次搜索行为:

复制代码
   CREATE TABLE `ls_search_log` (
     `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
     `user_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID,0为游客',
      `keyword` varchar(100) NOT NULL DEFAULT '' COMMENT '搜索关键词',
      `result_count` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '结果数量',
      `is_clicked` tinyint NOT NULL DEFAULT 0 COMMENT '是否有商品点击',
      `click_goods_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '点击的商品ID',
     `ip` varchar(45) NOT NULL DEFAULT '',
     `create_time` int UNSIGNED NOT NULL DEFAULT 0,
      PRIMARY KEY (`id`),
      KEY `idx_keyword_time` (`keyword`, `create_time`),
      KEY `idx_create_time` (`create_time`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='搜索行为日志表'

4.2 热词自动统计

通过定时任务,每日凌晨统计过去 7 天的搜索日志,生成热词排行榜:

复制代码
     class HotWordStatService
     {
           public function statDaily()
          {
              $sevenDaysAgo = strtotime('-7 days');
              $todayStart = strtotime('today');

             // 统计搜索频次
             $hotWords = SearchLogModel::where('create_time', '>=', $sevenDaysAgo)
               ->where('keyword', '<>', '')
               ->group('keyword')
               ->field('keyword, count(*) as search_count, 
                         sum(is_clicked) as click_count,
                         count(distinct user_id) as user_count')
               ->order('search_count', 'desc')
               ->limit(50)
               ->select();

            // 计算热度分:搜索频次 * 0.6 + 点击率 * 100 * 0.3 + 用户覆盖 * 0.1
            $hotList = [];
            foreach ($hotWords as $item) {
                 $clickRate = $item['search_count'] > 0
                       ? $item['click_count'] / $item['search_count'] : 0;
            $hotScore = $item['search_count'] * 0.6
                + $clickRate * 100 * 0.3
                + $item['user_count'] * 0.1;

            $hotList[] = [
                  'keyword' => $item['keyword'],
                  'hot_score' => round($hotScore, 2),
                  'search_count' => $item['search_count'],
        ];
    }

            // 更新热词表
            foreach (array_slice($hotList, 0, 20) as $sort => $item) {
                HotSearchModel::updateOrCreate(
                      ['name' => $item['keyword']],
                      [
                       'sort' => 100 - $sort,
                       'search_count' => $item['search_count'],
                       'hot_score' => $item['hot_score'],
                       'source' => 2, // 2-系统自动采集
                       'update_time' => time(),
                      ]
                  );
              }

               // 清理7天前的日志(保留90天用于分析)
               SearchLogModel::where('create_time', '<', strtotime('-90 days'))->delete();
          }
       }

4.3 热词表结构扩展

复制代码
    ALTER TABLE `ls_hot_search`
      ADD COLUMN `search_count` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '搜索次数',
      ADD COLUMN `hot_score` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '热度分',
      ADD COLUMN `source` tinyint NOT NULL DEFAULT 1 COMMENT '来源:1-人工添加,2-系统自动采集',
      ADD COLUMN `redirect_url` varchar(500) NOT NULL DEFAULT '' COMMENT '跳转链接,为空则按关键词搜索',
      ADD COLUMN `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:0-禁用,1-启用',
      ADD COLUMN `update_time` int UNSIGNED NOT NULL DEFAULT 0;

4.4 后台热词管理

在后台"运营 → 搜索管理 → 热词管理"中提供以下功能:

功能 说明
热词列表 展示所有热词,含来源(人工/自动)、搜索次数、热度分、排序
手动添加 添加热词并设置排序和跳转链接
批量启用/禁用 批量操作热词状态
一键刷新 手动触发热词统计任务
搜索日志查看 查看原始搜索日志,支持按关键词和时间筛选

同时,前台搜索框的"默认热词"从 HotSearch 表读取,按 sort 降序展示前 10 个,仅展示 status = 1 的热词。

五、搜索无结果智能推荐

5.1 推荐策略设计

搜索无结果时,不再返回空列表,而是展示替代推荐;推荐策略分三层:

第一层:同义词替换。维护同义词库,搜索词无结果时尝试用同义词重新搜索;例如"手机壳"无结果时,尝试"保护壳"。

第二层:近义词纠错。基于搜索日志中的高频词做拼写纠错;例如"连衣群"纠正为"连衣裙"。

第三层:热门商品兜底。以上策略均无结果时,推荐于搜索词分类相关的热门商品。

5.2 同义词库表

复制代码
     CREATE TABLE `ls_search_synonym` (
        `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
        `primary_word` varchar(50) NOT NULL COMMENT '主词',
        `synonym_words` varchar(500) NOT NULL DEFAULT '' COMMENT '同义词列表,逗号分隔',
        `status` tinyint NOT NULL DEFAULT 1,
        `create_time` int UNSIGNED NOT NULL DEFAULT 0,
        PRIMARY KEY (`id`),
        KEY `idx_primary_word` (`primary_word`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='搜索同义词表';

5.3 无结果推荐实现

复制代码
       public function searchWithFallback($keyword, $page, $size)
       {
          // 首次搜索
          $result = $this->search($keyword, $page, $size);
          if ($result['total'] > 0) {
              return $result;
          }

          // 第一层:同义词替换
          $synonyms = SearchSynonymModel::where('primary_word', $keyword)
               ->where('status', 1)->value('synonym_words');
          if ($synonyms) {
             foreach (explode(',', $synonyms) as $synonym) {
                $result = $this->search(trim($synonym), $page, $size);
                if ($result['total'] > 0) {
                    $result['fallback_type'] = 'synonym';
                    $result['fallback_word'] = trim($synonym);
                    return $result;
                 }
             }
          }

           // 第二层:拼音纠错
           $pinyinResult = $this->searchByPinyin($keyword, $page, $size);
           if ($pinyinResult['total'] > 0) {
               $pinyinResult['fallback_type'] = 'pinyin';
               return $pinyinResult;
             }

           // 第三层:热门商品兜底
           $hotGoods = GoodsModel::where('status', 1)->where('del', 0)
               ->order('sales', 'desc')
               ->page($page, $size)
               ->select();
           return [
              'list' => $hotGoods,
              'total' => count($hotGoods),
              'fallback_type' => 'hot',
              'fallback_tip' => '未找到相关商品,为您推荐热门商品',
             ];
         }

5.4 搜索建议(自动补全)

在用户输入关键词的过程中,实时返回搜索建议;数据源为热词表和高频搜索日志:

复制代码
      public function suggest($input)
      {
          if (mb_strlen($input) < 1) return [];

          // 从热词表匹配前缀
          $hotWords = HotSearchModel::where('name', 'like', $input . '%')
               ->where('status', 1)
               ->order('hot_score', 'desc')
               ->limit(5)
               ->column('name');

           // 从搜索日志匹配高频词
           $logWords = SearchLogModel::where('keyword', 'like', $input . '%')
               ->where('create_time', '>=', strtotime('-30 days'))
               ->group('keyword')
               ->order('count(*)', 'desc')
               ->limit(5)
               ->column('keyword');

           return array_unique(array_merge($hotWords, $logWords));
      }

六、完整开发步骤总结

6.1 数据库变更清单

操作 表名 变更内容
ALTER ls_hot_search 新增 search_count、hot_score、source、redirect_url、status、update_time 字段
CREATE ls_goods_search_index 新建商品搜索分词索引表
CREATE ls_search_log 新建搜索行为日志表
CREATE ls_search_weight_config 新建搜索权重配置表
CREATE ls_search_synonym 新建搜索同义词表
CREATE ls_goods_pinyin_index 新建商品拼音索引表

6.2 后端开发清单

模块 文件/类 工作内容
数据层 GoodsSearchIndexModel 新建 Model
数据层 SearchLogModel 新建 Model
数据层 SearchWeightConfigModel 新建 Model
数据层 SearchSynonymModel 新建 Model
数据层 HotSearchModel 扩展字段映射
业务层 SegmentService 新建 Service,封装 SCWS 分词逻辑
业务层 GoodsSearchIndexService 新建 Service,商品上架时自动构建分词索引
业务层 SearchEngineService 新建 Service,替换原生模糊搜索,接入分词检索和排序
业务层 GoodsRankService 新建 Service,多因子加权打分排序
业务层 HotWordStatService 新建 Service,热词自动采集和统计
业务层 SearchFallbackService 新建 Service,无结果时的同义词、拼音、热销兜底
业务层 PinyinIndexService 新建 Service,拼音索引构建和检索
后台接口 SearchManageController 热词管理、权重配置、同义词管理、搜索日志查询
事件 GoodsCreateEvent 商品上架时触发索引构建
定时任务 Crontab.php 新增热词统计任务、索引重建任务

6.3 后台前端开发清单

页面 工作内容
运营 → 搜索管理 → 热词管理 热词列表(来源标识、搜索次数、热度分)、手动添加、启用/禁用、一键刷新
运营 → 搜索管理 → 权重配置 五个权重因子的滑块配置,实时预览总和
运营 → 搜索管理 → 同义词管理 同义词增删改查
运营 → 搜索管理 → 搜索日志 日志列表,支持按关键词、时间、是否有结果筛选
系统设置 → 定时任务 新增"搜索热词统计"和"商品索引重建"任务记录

6.4 开发注意事项

二开规范方面:遵循"稳定内核原则",不修改 SearchLogic.php 的原生 hotLists() 方法,新建 SearchEngineService 作为搜索核心;分词索引的构建通过商品上架事件触发,与商品管理模块解耦;权重配置和热词管理作为独立的后台模块开发。

分词性能方面:SCWS 的 scws_new() 实例建议在请求生命周期内复用,避免频繁创建销毁;商品标题的分词和索引构建通过队列异步处理,不阻塞商品上架流程,搜索候选集限制在 500 条以内,避免 whereIn 的 IN 子句过长。

热词统计方面:搜索日志的写入建议走 Redis 异步队列,避免每次搜索都同步写库;热词统计任务在凌晨低峰期执行,统计窗口为 7 天,兼顾时效性和计算量。

兼容性方面:新增的搜索排序选项(综合排序)在接口中作为可选参数,不传时默认按原生销量排序,保证存量前端不受影响;热词表的新增字段全部设置默认值,保证存量数据可用。

拼音搜索的索引维护:拼音索引在商品标题修改时需要同步重建;建议将拼音索引和分词索引的构建放在同一个队列任务中,保证两者的一致性。

相关推荐
计算机毕设定制辅导-无忧学长1 小时前
《基于微信小程序的校园文化活动报名与管理系统》
java·spring boot·微信小程序·uniapp·校园文化活动报名与管理小程序
靠沿1 小时前
MySQL数据库基础——索引的使用&alter、explain关键字
java·数据库·mysql
9624561 小时前
餐饮 SaaS 优惠券系统架构演进(七)营销定价引擎设计:活动、会员价、优惠券、买赠如何在同一 PriceQuote 中可解释地组合
java·运维·算法
码匠许师傅1 小时前
【C++三方组件】redis-plus-plus:现代 Redis C++ 客户端
java·c++·redis
ab1237681 小时前
MQTT笔记
java·笔记·mqtt·学习
恋猫de小郭1 小时前
Flitz ,一个把 Flutter 玩成热插拔 Preview 的有趣项目,不错的思路
android·前端·flutter
二宝哥1 小时前
【问题】代理转发到后端使用request.getRequestURL()地址没有端口
java
霸道流氓气质1 小时前
HashiCorp Vault 与云 KMS 入门实战:动态密钥、SecretLeaseContainer 与 Java 集成完整指南
java·开发语言
wuminyu1 小时前
stackChunkOop内部结构与GC屏障的配合工作原理剖析
java·linux·c语言·jvm·c++