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 的"扩展优先"原则,搜索优化采用以下策略:
- 不修改 SearchLogic.php 的原生方法,新建独立的 SearchEngineService 作为搜索核心
- 引入轻量分词引擎,对商品标题进行预分词并建立倒排索引,替换 %like% 模糊匹配
- 新增搜索日志表和热词统计表,通过定时任务自动采集和更新热词
- 搜索排序采用多因子加权打分模型,后台可配置各因子的权重系数
二、中文分词方案选型与集成
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 天,兼顾时效性和计算量。
兼容性方面:新增的搜索排序选项(综合排序)在接口中作为可选参数,不传时默认按原生销量排序,保证存量前端不受影响;热词表的新增字段全部设置默认值,保证存量数据可用。
拼音搜索的索引维护:拼音索引在商品标题修改时需要同步重建;建议将拼音索引和分词索引的构建放在同一个队列任务中,保证两者的一致性。