如何为Web应用曲目搜索栏实现更精准的分词搜索结果
曲目搜索精度优化落地步骤
你当前方案的核心缺陷是采用了无字段差别的逐词OR匹配逻辑,既没有区分搜索词命中的字段属性,也没有识别搜索词里的实体关联,才会出现跨艺人、跨字段的误匹配。按照以下步骤调整即可达到你要的兼顾灵活性和准确率的效果,不需要引入复杂的搜索引擎,基于现有全量曲目数据就能实现:
1. 提前完成曲库标准化预处理
不要在用户发起搜索时才临时处理匹配目标,离线提前处理所有曲目的元数据:
- 用你现有的
tokenize函数,分别对每首曲目的「主艺人名称」「曲目标题」「合作艺人名称」做分词,存储为对应字段的分词数组,比如每首曲目提前生成artistTokens、titleTokens两个固定字段 - 整理一份场景停用词表,把分词结果里无搜索意义的通用词(比如示例里的
it、feat)加入表中,后续匹配时这类词不参与权重计算,避免干扰结果 - 额外生成每首曲目的
allTokens字段,为上述两个有效分词数组的去重合并集合,用于全量匹配兜底
2. 搜索优先识别艺人实体,缩小候选范围
拿到用户输入的分词数组后,第一步优先匹配艺人实体,从根源避免跨艺人的误匹配:
- 从最长的分词前缀开始尝试匹配曲库的
artistTokens:比如用户输入分词为["zero","7","give"],先取前2个连续分词["zero","7"]校验是否能完全命中某个艺人的分词集合,如果命中,直接把候选结果集缩小为该艺人名下的所有曲目,后续匹配仅在这个候选集内进行 - 如果前缀匹配到多个艺人,就把这些艺人的所有曲目都纳入候选集,给艺人名称完全命中的结果预置更高的基础分
- 如果所有长度的分词组合都匹配不到有效艺人,直接退回到全量曲库作为候选集,保证搜索的灵活性
3. 替换布尔匹配为加权打分排序
放弃「命中任意词就加入结果集」的布尔逻辑,对候选集内的所有曲目按规则计算匹配分,最终按得分从高到低返回,得分低于阈值的结果直接过滤:
- 基础权重设置:艺人字段命中搜索词的权重远高于标题字段,比如艺人字段每命中1个有效搜索词加10分,标题字段每命中1个有效搜索词加3分
- 连续命中额外加权:如果搜索词中的连续分词,在目标字段的分词数组中也是连续相邻出现的,额外增加权重,比如
["zero","7"]连续命中艺人分词加15分,["give","it","away"]连续命中标题分词加10分 - 全量命中加分:如果用户输入的所有有效搜索词(剔除停用词)全部在某首曲目的
allTokens中命中,额外加20分,避免只命中单个零散词的无关内容排在前列 - 锁定艺人后的过滤规则:如果已经通过实体匹配锁定了艺人范围,直接过滤掉标题字段未命中任何非艺人类搜索词的结果——比如锁定Zero 7为候选范围后,仅保留标题命中
give相关分词的曲目,其余该艺人未命中标题词的曲目全部剔除
4. 增加兜底逻辑兼容边缘场景
- 如果锁定艺人后的候选集内,没有任何曲目命中剩余的标题类搜索词,自动解除艺人锁定,回到全量曲库做加权匹配,避免因为艺人名拼写误差、搜索词巧合重叠导致无结果返回
- 当用户输入的有效分词长度小于2(比如仅输入单个字、单个数字)时,不触发艺人实体锁定逻辑,直接走全量曲库加权匹配,避免误锁定导致结果不全
内容的提问来源于stack exchange,提问作者Mihkel Pajunen
相关产品推荐
相关产品推荐

