面试知识

倒排索引、分词、相关性与搜索工程

31-存储搜索时序 面试知识整理。

倒排索引、分词、相关性与搜索工程

项目版本:待现场核对。学习基线版本:待现场核对。本文不固化默认分析器、评分参数、同义词装载方式、脚本能力、缓存资格与向量检索行为;所有版本敏感结论均进入版本核对卡,以现场配置、插件清单、官方章节和最小实验为准。

1. 索引结构与写入代价

1.1 从完整文档构造 term dictionary(词项字典)与 postings list(倒排表)

倒排索引先回答“哪些文档含某个词项”,再读取候选文档,而不是逐篇扫描原文。设三个完整商品文档:D1=红色 无线 鼠标 静音,D2=无线 鼠标 办公,D3=红色 鼠标 垫。规范化后按空格切词,词位从 0 开始,字符 offset(偏移量)采用左闭右开区间。term dictionary(词项字典)按词项有序保存定位入口;postings list(倒排表)保存文档编号,以及可选的 term frequency(词频)、position(词位)、offset(偏移量)和 norm(归一化因子)。document frequency(文档频率)是包含该词项的文档数,不是它在全集出现的总次数。

表 1:样例文档的词元明细

文档原始字段字段长度词元、词位与偏移norm(归一化因子)示意
D1红色 无线 鼠标 静音4红色 (0,0..2);无线 (1,3..5);鼠标 (2,6..8);静音 (3,9..11)1/sqrt(4)=0.500
D2无线 鼠标 办公3无线 (0,0..2);鼠标 (1,3..5);办公 (2,6..8)1/sqrt(3)=0.577
D3红色 鼠标 垫3红色 (0,0..2);鼠标 (1,3..5);垫 (2,6..7)1/sqrt(3)=0.577

表 2:由三篇文档生成的倒排结构

词项document frequency(文档频率)postings list(倒排表),格式为 文档:词频:[词位]:[偏移]
办公1D2:1:[2]:[6..8]
1D3:1:[2]:[6..7]
红色2D1:1:[0]:[0..2] -> D3:1:[0]:[0..2]
静音1D1:1:[3]:[9..11]
无线2D1:1:[1]:[3..5] -> D2:1:[0]:[0..2]
鼠标3D1:1:[2]:[6..8] -> D2:1:[1]:[3..5] -> D3:1:[1]:[3..5]

词项定位先在 term dictionary(词项字典)中查“无线”和“静音”的入口,再顺序读取两个 postings list(倒排表)。求交集时比较文档编号:无线=[1,2]静音=[1][1];求并集得到 [1,2]。长表可按固定间隔保存 skip data(跳跃数据),当左表当前编号明显落后时跳到更大的候选,减少逐项比较;它只减少访问量,不改变集合结果。position(词位)支持“无线 鼠标”的相邻与顺序判断,offset(偏移量)支持高亮还原,norm(归一化因子)压缩保存字段长度等评分信号。是否保存词位、偏移和 norm(归一化因子)应由短语、高亮、评分需求决定,因为每项都会放大磁盘和写入。

flowchart LR
  A[三篇原始文档] --> B[规范化与切词]
  B --> C[词项字典]
  C --> D1[无线入口]
  C --> D2[静音入口]
  D1 --> P1[文档 1 与文档 2]
  D2 --> P2[文档 1]
  P1 --> I[跳跃比较并求交集]
  P2 --> I
  I --> R[候选文档 1]
  X[词位未保存] -.短语失败.-> R
  Y[偏移未保存] -.高亮降级.-> R

图 1 说明。 节点 A 至 C 表示写入期把全文预计算为词项入口,D1、D2 与 P1、P2 是查询期只读取相关倒排表,I 表示按有序文档编号跳跃求交。实线是正常路径,虚线是未保存词位或偏移后的能力失败。前提是索引与查询使用兼容词项;正常输出是文档 1;失败时仍可能召回文档,却无法可靠判断短语或高亮。业务结论是结构能力必须在写入前按查询需求设计。

数据演绎 1:跳跃与交并集。 输入 红色=[1,3,8,15,21,34]鼠标=[1,2,3,5,8,13,21,34],每三项有一个跳点。逐项求交最多比较 10 余次;利用从 8 跳到 21 的有序边界可跳过不可能区间,输出交集 [1,3,8,21,34]。并集按双指针输出 [1,2,3,5,8,13,15,21,34]。若倒排表只有几十项,读取跳点本身可能不划算;只有长且稀疏的列表才有明显收益。

热门面试题

  1. 问题(基础题):document frequency(文档频率)与 term frequency(词频)有什么区别?
    • 考点:集合稀有度与文档内重复度。
    • 回答思路:分别限定统计范围,再说明评分用途。
    • 详细答案:document frequency(文档频率)统计包含某词项的文档数量,反映它在全集是否稀有;term frequency(词频)统计该词项在某一文档字段内出现多少次,反映当前文档对词项的强调程度。前者进入逆文档频率,后者进入单文档饱和项,两者不能互换。
    • 进阶追问:同一词出现十次是否得分线性增长?
    • 进阶回答:通常不会,BM25(最佳匹配 25)会让词频收益逐渐饱和,避免堆词无限抬分。
  2. 问题(原理题):position(词位)与 offset(偏移量)为何要分开保存?
    • 考点:短语判断与字符展示。
    • 回答思路:用相邻词和高亮两个能力说明。
    • 详细答案:position(词位)表达词元在分析结果中的相对顺序,短语查询据此判断相邻和间隔;offset(偏移量)表达词元在原字段字符区间中的位置,高亮据此截取原文。字符过滤可能改变原文与词元边界,所以两者承担不同责任。
    • 进阶追问:不做短语和高亮能否关闭它们?
    • 进阶回答:可以评估关闭以节省空间,但必须确认未来查询契约,关闭后通常需要重建索引才能恢复能力。
  3. 问题(场景题):倒排表求交为什么能使用跳跃?
    • 考点:有序列表与剪枝前提。
    • 回答思路:说明单调文档编号和跳点成本。
    • 详细答案:倒排表按文档编号有序,当一侧编号落后时,小于另一侧当前编号的项不可能进入交集,因此可跳到不超过目标的更大编号。跳跃减少解码与比较,但跳点占空间,短列表或高密度交集未必收益。
    • 进阶追问:跳跃会改变召回结果吗?
    • 进阶回答:正确实现只剪掉数学上不可能相交的区间,不改变结果;错误边界则会漏召回,需用朴素算法对拍。

1.2 倒排索引与 B-Tree(平衡树索引)的目标、定位与成本

B-Tree(平衡树索引)按完整键或可利用的有序前缀组织记录,擅长运单号、SKU(库存单位)、租户标识、时间范围和排序;倒排索引按“词项 -> 文档集合”组织,擅长一个字段含多个词、跨字段组合、相关性和短语。用 B-Tree(平衡树索引)查询 tracking_no='CN123' 可沿树高定位少量叶子;查询商品名“红色无线鼠标”若只存完整字符串,不能自然拆成三个词并按相关性组合。反过来,用分词后的全文字段找精确运单号可能被大小写、连字符或分词规则破坏,因此应另建 keyword(精确字段)。

表 3:两类索引的工程边界

维度B-Tree(平衡树索引)倒排索引
主键形态一个可比较的完整键或有序复合键一个文档可产生多个词项
典型问题精确、范围、前缀有序扫描、排序全文召回、布尔集合、短语、相关性
写入代价分裂、重平衡、页写与日志分词、多字段、倒排、词位、分段与合并
读取代价树高加叶子范围和回表词项定位、倒排解码、集合运算与评分
失败边界左前缀不匹配、范围过宽、回表过多高频词长表、分析不一致、扩召噪声、评分昂贵
项目用法权威库中的单号与业务约束可重建的商品、轨迹和报警搜索投影
flowchart TB
  Q[查询目标] --> E{完整键还是文本含义}
  E -->|运单号与租户键| B[B-Tree(平衡树索引)有序定位]
  E -->|商品名与报警描述| I[倒排词项定位]
  B --> R1[精确记录或范围]
  I --> R2[召回集合与相关性]
  W[把运单号仅建全文字段] -.分析破坏.-> I
  F[把商品名仅建完整键] -.无法拆词.-> B

图 2 说明。 Q 与 E 先区分查询目标,B 服务完整有序键,I 服务文本含义,箭头分别到精确记录和相关候选。前提是同一原始字段允许按用途建立多字段;正常路径中运单号走精确字段、商品名走全文字段;失败路径是建模反置。业务结论不是二选一,而是让权威约束留在数据库,让搜索投影按访问模式预计算。

数据演绎 2:混合运单号与中文商品名。 查询 CN-9388 红色鼠标。字段模型把 CN-9388tracking_no.keyword 精确召回 D7,把“红色鼠标”在 product_name.text 分析为“红色、鼠标”召回 D1、D3、D7。多路候选合并后,D7 因单号精确命中获得最高业务权重;D1、D3 只作为商品名候选。若把整串交给同一个中文分词器,单号可能切碎并产生大量误匹配;若全部走精确键,则中文商品名零结果。

热门面试题

  1. 问题(基础题):倒排索引能否替代 B-Tree(平衡树索引)?
    • 考点:访问模式与权威约束。
    • 回答思路:对比全文含义和精确有序键。
    • 详细答案:不能泛化替代。倒排索引适合从词项到文档集合的召回与评分,B-Tree(平衡树索引)适合完整键、范围和排序,并常承载权威库约束。项目通常把数据库作为事实源,把搜索索引作为可重建读模型。
    • 进阶追问:SKU(库存单位)同时需要模糊找和精确过滤怎么办?
    • 进阶回答:建立全文与精确多字段,模糊入口受控召回,过滤、聚合和最终业务核验使用精确字段。
  2. 问题(原理题):为什么倒排索引是空间与写放大换低延迟?
    • 考点:预计算与查询扫描边界。
    • 回答思路:从一篇文档产生多条结构说明。
    • 详细答案:写入时要解析原文、生成多个词项、更新词项到文档关联,并可能保存词频、词位、偏移、归一化和多字段结构;查询时则直接读取少量相关倒排表,避免扫描全部原文。代价还包括不可变分段和后台合并。
    • 进阶追问:关闭不用的索引能力有什么价值?
    • 进阶回答:可减少磁盘、合并和写入处理,但能力恢复往往要重建,所以要先固化查询契约。
  3. 问题(场景题):运单号为何通常不应只使用全文字段?
    • 考点:标识符分词风险。
    • 回答思路:列举大小写、连字符和前导零。
    • 详细答案:运单号的语义是完整标识,分析器可能按连字符切分、折叠大小写或丢弃短片段,导致精确查找漏召回或误召回。应保留原值的 keyword(精确字段),全文或 ngram(多元切分)子字段只能用于受控容错。
    • 进阶追问:搜索命中后能否直接认定轨迹状态?
    • 进阶回答:不能,搜索只定位候选,轨迹事实仍由数据库或事件日志回源确认。

1.3 Lucene(全文检索库)segment(分段)、删除标记、合并与近实时可见

Lucene(全文检索库)的 segment(分段)一旦发布便保持不可变。新文档先在内存缓冲中分析并构造结构,refresh(刷新)打开新 segment(分段)后对新搜索器可见;删除与更新不原地改写旧段,而以删除标记和新文档表达。merge(合并)把多个小段重写成大段,跳过已删除文档并重建字典、倒排和列式结构,随后旧段才能回收。不可变降低并发读写锁复杂度并利于缓存复用,但会带来旧版本共存、删除未立即释放空间、合并输入输出和临时磁盘,因此“近实时可见”不等于“零成本实时更新”。写入确认、持久化与分片复制边界见Elasticsearch(搜索引擎)分片副本、写入查询与一致性

sequenceDiagram
  participant W as 写入请求
  participant A as 索引分析链
  participant M as 内存缓冲
  participant S as 新分段
  participant Q as 搜索器
  participant G as 后台合并
  W->>A: 文档与字段
  A->>M: 词项和倒排项
  M->>S: 刷新形成不可变分段
  S-->>Q: 打开新视图并近实时可见
  W->>S: 更新时标记旧文档删除
  W->>M: 写入新版本
  G->>S: 合并多个分段并清理删除项
  alt 合并空间不足
    G--xS: 合并暂停且旧段继续占空间
  end

图 3 说明。 W、A、M、S 构成索引期正常路径,Q 表示刷新后查询可见,G 表示异步整理;更新箭头同时产生旧文档删除标记和新版本。前提是有足够刷新与合并资源;正常路径中新段发布后被搜索器打开;失败路径是临时空间不足导致合并暂停、删除空间不回收。业务结论是频繁更新和短刷新会把召回低延迟的成本转移到写入、磁盘和后台合并。

表 4:不可变分段的四个时间点

时间点结构变化用户可能观察到不能推出
写入进入缓冲新词项尚未被搜索器打开按标识查证与搜索结果可能不同已搜索可见
refresh(刷新)新 segment(分段)被打开新版本可被普通搜索命中旧段已回收
删除标记可见旧文档被逻辑排除查询不再返回旧版本磁盘立即下降
merge(合并)完成重写段并清理删除项段数和空间可能下降业务源事实被修改

数据演绎 3:小段与合并写放大。 每秒写 5000 篇报警文档,若每 1 秒刷新,10 分钟至少形成约 600 个刷新批次;每批 5000 篇,后台还要逐级合并。将普通报警可见目标放宽到 10 秒,理论批次降为约 60 个,而严重报警走独立快速通道。若更新 100 万篇旧文档,新旧版本在合并前共存,磁盘峰值必须同时容纳旧段、新段和合并临时输出。

热门面试题

  1. 问题(基础题):segment(分段)不可变是否意味着不能更新?
    • 考点:逻辑更新与物理重写。
    • 回答思路:说明删除旧版加索引新版。
    • 详细答案:业务接口可以更新,但底层通常为旧文档增加删除标记并写入新文档,新旧结构在合并前可能同时存在。不可变指已发布分段不原地修改,不是业务文档永远不变。
    • 进阶追问:为什么删除后磁盘不立刻下降?
    • 进阶回答:删除标记先让查询排除文档,真正回收要等包含它的旧分段被合并重写且不再被读取。
  2. 问题(原理题):refresh(刷新)越频繁为什么写入越贵?
    • 考点:小段数量与合并压力。
    • 回答思路:从发布频率推到搜索器和合并。
    • 详细答案:频繁刷新把较小缓冲更早发布为许多小 segment(分段),增加文件、词典、搜索器打开和每次查询遍历的固定成本,后台还要进行更多轮合并。可见延迟降低,却以吞吐、磁盘输入输出和处理器为代价。
    • 进阶追问:严重报警也要等十秒吗?
    • 进阶回答:可按业务等级拆索引或写入通道,让关键摘要短刷新,普通明细批量发布,避免全量采用最高新鲜度。
  3. 问题(场景题):合并积压时应先调大合并并发吗?
    • 考点:根因与资源竞争。
    • 回答思路:先看小段来源和磁盘余量。
    • 详细答案:不能直接调大。先确认刷新频率、批次、更新比例、段数、删除比例和磁盘队列;并发过高可能与查询、写入和副本恢复争用磁盘。止血可暂停低优先级回填并降低写入碎片,修复再按真实设备能力压测。
    • 进阶追问:搜索正常是否说明合并积压可忽略?
    • 进阶回答:不能,旧段和删除项会持续占空间,最终可能触发磁盘保护并放大查询尾延迟。

2. 分析链与字段模型

2.1 character filter(字符过滤器)、tokenizer(分词器)与 token filter(词元过滤器)

分析链严格按 character filter(字符过滤器)到 tokenizer(分词器)再到 token filter(词元过滤器)执行。第一步可处理标签、全角半角、特殊连接符与字符映射,并应维护偏移修正;第二步决定词元边界;第三步完成小写、停用词、同义词、词干或拼音等词元级变换。顺序会改变结果:先把全角 ABC 规范为 ABC 再切分,和先按不兼容规则切分并不等价;同义词若在停用词删除后失去上下文,也可能无法匹配多词规则。

sequenceDiagram
  participant D as 原始文本
  participant C as 字符过滤器
  participant T as 分词器
  participant F as 词元过滤器
  participant O as 索引词元
  D->>C: ABC-9388 红色静音鼠标
  C->>T: ABC-9388 红色静音鼠标与偏移修正
  T->>F: ABC-9388、红色、静音、鼠标
  F->>O: abc-9388、红色、静音、鼠标
  alt 先错误切碎标识符
    T--xF: abc、9388 产生误召回
  end

图 4 说明。 D、C、T、F、O 是有序分析节点,箭头携带文本、偏移和词元;前提是字符规范化规则与标识符边界已定义。正常路径保留完整运单号并规范大小写;失败路径先切碎连接符标识,导致短片段污染召回。业务结论是分析链不是插件清单,必须用真实语料逐阶段观察输出。

表 5:分析链各阶段的责任与风险

阶段输入输出合适动作典型风险
character filter(字符过滤器)字符流到规范字符流标签清理、全半角与连接符映射偏移修正错误,高亮错位
tokenizer(分词器)字符流到有边界词元中文切词、标识符整体保留过切产生短词噪声,少切导致零结果
token filter(词元过滤器)词元流到新词元流小写、停用词、同义词、拼音词位图错误、同义词爆炸、语义丢失

数据演绎 4:中文、全半角与短词噪声。 语料为 ABC-9388 苹果手机壳。正确链输出 abc-9388、苹果、手机壳;若二元 ngram(多元切分)无边界地作用于全部字段,会产生 ab、bc、c-、-9、93、38、88、苹果、果手、手机、机壳 等候选。查询“机”可能匹配几乎所有“手机、机器、机场”文档。验收语料必须同时包含标识符、中文复合词、单字品牌和全角输入,并统计零结果率与误匹配率。

热门面试题

  1. 问题(基础题):分析链三个阶段为何不能随意换序?
    • 考点:阶段输入类型与语义依赖。
    • 回答思路:用全角规范和同义词上下文举例。
    • 详细答案:字符过滤先改变字符流并维护偏移,分词器再决定边界,词元过滤只处理已生成词元。换序可能让标识符被错误切碎、多词同义词失去邻接关系或高亮偏移错误,所以必须固定顺序并保存样例输出。
    • 进阶追问:停用词是否越多越省空间?
    • 进阶回答:会省部分倒排项,也可能破坏短语、专名和用户意图;应以标注语料评测,而不是按词频机械删除。
  2. 问题(原理题):中文分词的核心难点是什么?
    • 考点:无天然空格与领域词典。
    • 回答思路:从边界歧义、专名和新词说明。
    • 详细答案:中文缺少天然词界,同一串字符可能有多种切法;渠道名、SKU(库存单位)、仓库简称和报警术语还会持续新增。切得太粗导致漏召回,太细产生短词噪声,必须用领域语料、词典版本和评测集约束。
    • 进阶追问:加一个中文分词器就能解决搜索质量吗?
    • 进阶回答:不能,还涉及字段模型、查询意图、同义词、过滤、评分、权限、标注集和发布回滚。
  3. 问题(场景题):高亮位置错乱应查什么?
    • 考点:偏移链路。
    • 回答思路:比较原文、字符过滤输出和词元偏移。
    • 详细答案:先保存原文与字符过滤后的文本,检查标签删除、字符替换是否提供正确偏移修正;再看分词输出的起止 offset(偏移量)和高亮字段是否一致。不能只改前端截取,因为根因可能在索引结构。
    • 进阶追问:重新查询能修复旧文档偏移吗?
    • 进阶回答:若错误已写入旧索引,修改查询端通常不够,需要新分析规则重建并用高亮样例回归。

2.2 index analyzer(索引分析器)、search analyzer(搜索分析器)与同义词边界

index analyzer(索引分析器)决定写入后永久落盘的词项,search analyzer(搜索分析器)决定用户输入生成哪些查询词项。二者不要求字面完全相同,但必须语义兼容:索引把“国际快递”切成“国际、快递”,查询却只生成“国际快递”完整词项,就可能零结果;查询端加入“手机壳 -> 保护壳”的同义词可即时扩召,却会让候选和布尔组合膨胀;索引端展开同义词把多个词项预写入,查询较轻,但词典改变后旧文档无法自动拥有新词项,通常需要重建。

sequenceDiagram
  participant I as 索引分析器
  participant X as 不可变索引
  participant S as 搜索分析器
  participant Q as 查询执行器
  participant R as 结果
  I->>X: 国际、快递
  S->>Q: 国际、快递
  Q->>X: 查两个兼容词项
  X-->>R: 返回候选
  alt 查询只生成国际快递
    S--xX: 词项不存在导致零结果
  else 新同义词仅在部分节点生效
    S--xQ: 候选集合随节点漂移
  end

图 5 说明。 I 与 X 是索引期,S 与 Q 是查询期,R 是兼容分析后的结果。前提是两条链的词元、词位图和词典版本可追踪;正常路径查询与落盘词项相交;失败路径分别是粒度不一致导致零结果、词典灰度不一致导致节点漂移。业务结论是每次词典发布都要记录索引代际和查询代际,而非只重启插件。

数据演绎 5:同义词扩召与准确率损失。 标注集有 100 个“手机壳”相关文档,原查询召回 70 个,其中 63 个相关,Precision(准确率)=63/70=0.90,Recall(召回率)=63/100=0.63。加入“保护壳、外壳”后召回 95 个,其中 80 个相关,Precision(准确率)降为 80/95=0.842,Recall(召回率)升为 0.80。若“外壳”还命中机器外壳,噪声继续增大。结论是扩召必须同时看准确率、首位质量和业务转化,不能只庆祝结果数增加。

热门面试题

  1. 问题(基础题):索引分析器和搜索分析器必须相同吗?
    • 考点:词项兼容而非配置相等。
    • 回答思路:先说可不同,再给兼容条件。
    • 详细答案:不必字面相同,例如索引保存基础词项,查询端可展开同义词;但查询生成的词项必须能与索引词项相交,词位关系也要符合短语语义。差异必须通过阶段输出、零结果和排序样例验证。
    • 进阶追问:查询端同义词的优势是什么?
    • 进阶回答:词典变化可更快生效且旧索引无需立刻改写,但会增加每次查询的扩展、布尔子句和延迟。
  2. 问题(原理题):为什么索引端同义词更新常需重建?
    • 考点:不可变落盘词项。
    • 回答思路:说明旧文档不会自动补词。
    • 详细答案:索引端分析结果已经写入不可变 segment(分段),新增同义规则只影响之后写入的文档,旧文档仍保留旧词项。要让全量语料使用同一规则,需要从权威源重新分析并写入新索引,再校验和切换。
    • 进阶追问:能否只更新受影响文档?
    • 进阶回答:理论上可定位后重写,但要证明覆盖全部受影响语料和删除,复杂度常不低于可控全量重建。
  3. 问题(场景题):同义词发布后同一查询结果漂移如何排查?
    • 考点:节点代际和请求证据。
    • 回答思路:按请求落点、词元输出和词典摘要核对。
    • 详细答案:记录请求标识、节点、索引别名、索引代际、分析器名和词典摘要;对同一查询逐节点执行分析与搜索,比较扩展词、候选和得分。若节点词典不一致,先停止灰度并回滚统一代际。
    • 进阶追问:只看最终结果差异够吗?
    • 进阶回答:不够,还要区分分析差异、索引内容差异、评分差异和权限差异,才能选择正确回滚点。

2.3 text(全文字段)、keyword(精确字段)、多字段与中文规范化

text(全文字段)服务分词召回和相关性,keyword(精确字段)保留完整值,服务精确过滤、去重、排序、聚合与权限。一个原始字段可通过 multi-field(多字段)建立不同视图,例如商品名同时保存中文全文、精确原值、拼音和受控 ngram(多元切分);每增加一份视图都会增加分析、倒排、列式值、段合并和磁盘成本。大小写、全半角、繁简体、标点、拼音和前导零不是统一“清洗”:运单号可折叠大小写但不能随意去掉校验位,SKU(库存单位)可能保留连字符,渠道名拼音用于召回却不能替代中文展示与精确去重。

表 6:项目字段建模矩阵

业务字段全文视图精确视图可选容错视图权威边界
跨境运单号通常不作为主召回完整值、规范大小写受控前缀或 ngram(多元切分)轨迹状态回数据库或事件日志
渠道名中文分词与同义词渠道编码和标准名拼音、历史别名渠道配置源裁决有效性
商品名中文全文字段原始名称和品牌编码拼音、二元或三元切分库存与价格回 WMS(仓储管理系统)
SKU(库存单位)可选分段容错完整 SKU(库存单位)前缀库存扣减回权威库存表
IoT(物联网)报警文本报警描述全文设备、租户、级别、规则编码领域同义词报警状态回事件与处置记录
运营权限不分词租户、仓库、角色、数据域授权服务与数据库策略裁决
flowchart LR
  A[商品名原值] --> T[中文全文字段]
  A --> K[精确字段]
  A --> P[拼音字段]
  A --> N[受控多元切分字段]
  T --> R[相关性召回]
  K --> F[过滤去重聚合]
  P --> R
  N --> R
  Z[所有字段都做多元切分] -.字段与词项爆炸.-> N
  U[权限字段被分词] -.越权风险.-> F

图 6 说明。 A 扇出为四种物理视图,T、P、N 汇入召回,K 汇入精确过滤。前提是每个子字段有明确查询入口和容量预算;正常路径按意图选字段;失败路径是全字段多元切分造成词项爆炸,或权限字段分词造成过滤语义破坏。业务结论是多字段是受成本约束的查询契约,不是越多越好。

表 7:规范化动作的可逆性与风险

动作适用示例主要收益主要风险
大小写折叠渠道英文简称、运单号副本减少输入差异大小写有业务含义时误合并
全半角统一中文运营输入统一键盘形态偏移修正错误
标点映射不同连字符提升标识符容错删除结构边界后误匹配
拼音扩召中文品牌和商品名支持无中文键盘输入多音字、短拼音噪声
停用词删除长描述中的低信息词降低部分词项成本专名、短语和否定含义丢失

热门面试题

  1. 问题(基础题):text(全文字段)与 keyword(精确字段)怎样选择?
    • 考点:召回和精确操作。
    • 回答思路:根据查询操作回答。
    • 详细答案:需要分词、相关性和短语时使用 text(全文字段);需要完整值过滤、排序、聚合、去重和权限时使用 keyword(精确字段)。同一原值可建多字段,但每个字段都应有真实查询和容量依据。
    • 进阶追问:商品名只建全文字段有什么问题?
    • 进阶回答:可搜索却难以稳定做完整名称去重、聚合和精确过滤,还可能受分析规则变化影响。
  2. 问题(原理题):拼音字段为什么容易产生误匹配?
    • 考点:多音字与短词碰撞。
    • 回答思路:说明多对多映射和候选扩张。
    • 详细答案:多个汉字或词可能共享相同拼音,多音字又可能生成多个读音;若再支持首字母和短前缀,候选集合会迅速增大。拼音应作为低权重辅助召回,并结合品牌、类目和点击反馈重排。
    • 进阶追问:拼音命中能否与中文精确命中同权?
    • 进阶回答:通常不应同权,中文完整或标准词命中信息量更高,权重需由标注集验证。
  3. 问题(场景题):动态字段导致字段爆炸如何治理?
    • 考点:映射边界和业务建模。
    • 回答思路:先止住新增,再收敛键空间。
    • 详细答案:第一类证据看字段总数、映射变更、集群状态和写入拒绝,第二类证据抽样业务文档的动态键来源。止血是拒绝未知字段或隔离异常租户;修复把任意属性改为受控键值结构或明确白名单,并重建新索引。
    • 进阶追问:删除映射中的字段就能恢复吗?
    • 进阶回答:已写结构通常不能靠简单删除彻底回收,应在新映射中重建并校验切换。

3. 查询语义与相关性计算

3.1 精确、分析、短语、布尔与多词匹配语义

term 查询直接使用给定词项,不执行全文分析,适合 keyword(精确字段)和已知落盘词项;match 查询先分析输入,再按生成词项构造匹配;phrase 查询还要求 position(词位)满足顺序和间隔。boolmust 要求命中,should 增加可选召回或得分,filter 只做真假约束并通常不参与相关性;minimum_should_match(最小匹配数)控制多词至少命中几个。查询语义错误比参数错误更危险:对全文字段发原始 term 可能零结果,把租户权限放 should 则可能返回未授权文档。

flowchart TB
  Q[用户查询红色无线鼠标] --> A[分析为红色 无线 鼠标]
  A --> M[必须条件]
  A --> S[可选条件]
  A --> P[短语条件]
  F[租户与可用性精确过滤] --> B[布尔组合]
  M --> B
  S --> B
  P --> B
  B --> R[候选与得分]
  E[权限进入可选条件] -.越权.-> R
  Z[最小匹配数过高] -.零结果.-> R

图 7 说明。 Q 经 A 生成词项,再分配到必须、可选和短语子句,F 独立提供精确硬过滤,B 合并后输出候选。前提是先区分相关性条件和业务硬约束;正常路径权限不可绕过;失败路径是权限误放可选条件或最小匹配数过高。业务结论是布尔结构先保证业务边界,再讨论得分优化。

表 8:常见查询的召回、成本与误匹配

查询是否分析主要用途召回与成本边界
term精确词项、编码、权限快且确定;用于全文原句可能零结果
match普通全文搜索召回较宽;依赖分析链和最小匹配数
phrase是并检查词位品牌词组、固定异常描述更准但读取词位,容忍间隔会扩召
bool must取决于子句必须满足的相关条件子句过多缩小召回并增加求交成本
bool should取决于子句可选信号与扩召过多会放大候选和误匹配
bool filter通常精确权限、租户、库存可用性不代表一定缓存;高基数也可能昂贵
minimum_should_match(最小匹配数)作用于可选子句控制多词命中门槛过低噪声大,过高长查询零结果

数据演绎 6:最小匹配数与短词噪声。 查询“红色 无线 鼠标 静音 办公”生成 5 个词。门槛为 1 时,只有“办公”的普通用品也进入候选 12000 篇;门槛为 3 时剩 860 篇,其中 720 篇相关;门槛为 5 时只剩 12 篇且漏掉没有“办公”词的静音鼠标。验证应按查询长度分桶设置规则,并分别观察 Precision(准确率)、Recall(召回率)与零结果率。

热门面试题

  1. 问题(基础题)termmatch 的本质区别是什么?
    • 考点:查询期是否分析。
    • 回答思路:从输入到落盘词项解释。
    • 详细答案term 把输入当成已经确定的词项直接查倒排表;match 先通过 search analyzer(搜索分析器)生成一个或多个词项再构造查询。精确编码通常用前者,用户自然语言通常用后者。
    • 进阶追问:全文字段能否使用 term
    • 进阶回答:语法上可能允许,但必须知道索引实际词项;原始大写或完整句子未必存在,容易零结果。
  2. 问题(原理题)filter 为什么不能简单等同于缓存?
    • 考点:过滤语义与缓存资格分离。
    • 回答思路:先说不评分,再说是否复用受条件影响。
    • 详细答案filter 表示只判断真假而不贡献相关性,这使某些结果更适合复用;但是否缓存取决于版本、查询形状、频率、分段、选择率和实现策略。一次性高基数条件即使是过滤也可能没有缓存收益。
    • 进阶追问:权限过滤能因缓存未命中而跳过吗?
    • 进阶回答:绝对不能,缓存只改变执行成本,不能改变授权语义。
  3. 问题(场景题):长查询零结果如何调整 minimum_should_match(最小匹配数)?
    • 考点:门槛分桶和离线评测。
    • 回答思路:按词数与意图区分而非统一下调。
    • 详细答案:先查看分析后有效词数、停用词和专名,再按查询长度、单号意图与商品意图分桶;用标注集比较不同门槛的零结果、准确率和召回率。权限与租户仍保持硬过滤,不能为扩召放松。
    • 进阶追问:门槛调为 1 是否最稳?
    • 进阶回答:会减少零结果,却可能让任意高频词都命中,扩大候选和错误匹配,不等于质量更好。

3.2 prefix(前缀)、wildcard(通配符)、fuzzy(模糊)与 ngram(多元切分)

prefix(前缀)查询枚举词典中以固定前缀开头的词项,适合长度受控的运单号或 SKU(库存单位)补全;wildcard(通配符)允许更自由模式,前导通配可能扫描大量词项;fuzzy(模糊)按编辑距离扩展相近词项,对英文拼写有帮助,但短中文、数字标识和高频词容易产生荒谬候选;ngram(多元切分)在写入时预建子串,查询快但显著放大词项、磁盘和误匹配。工程上先用精确、前缀和领域词典,再对少量字段开放模糊能力,设置最短输入、最大扩展、超时和降级。

flowchart LR
  Q[容错查询] --> L{输入长度与字段类型}
  L -->|完整运单号| E[精确查询]
  L -->|稳定开头且长度足够| P[前缀查询]
  L -->|英文少量错拼| F[受限模糊查询]
  L -->|中文补全专用字段| N[多元切分召回]
  L -->|前导通配| W[大范围词典枚举]
  W -.超时.-> D[降级到精确与前缀]
  F -.短词爆炸.-> D
  N -.候选噪声.-> D

图 8 说明。 Q 经 L 根据字段类型和输入长度选择精确、前缀、模糊或预切分路径,W 是高风险通配分支,D 是超时和噪声后的降级。前提是字段有独立容错视图和资源预算;正常路径优先信息量更高的查询;失败路径在扩展过大时回到精确与前缀。业务结论是模糊能力应受意图和成本门控。

表 9:模糊查询选择矩阵

能力召回率主要成本典型误匹配控制手段
prefix(前缀)枚举同前缀词项短前缀覆盖过宽最短长度、字段限定、候选上限
wildcard(通配符)模式匹配和词典枚举前导通配几乎无边界禁止前导通配、超时、异步
fuzzy(模糊)中到高编辑距离扩展数字和短词错误替换长度门槛、最大距离、扩展上限
ngram(多元切分)写入、磁盘、合并和候选短子串碰撞专用字段、最小粒度、低权重

热门面试题

  1. 问题(基础题):前导 wildcard(通配符)为什么危险?
    • 考点:无法利用固定前缀缩小词典范围。
    • 回答思路:从词典枚举和并发说明。
    • 详细答案:模式以任意字符开头时,很难先定位连续词典区间,可能检查大量词项并合并许多倒排表。单次低流量也许能返回,但并发后处理器、堆和尾延迟会急剧上升。
    • 进阶追问:运营必须做包含搜索怎么办?
    • 进阶回答:建立专用受控子串字段或离线任务,限制时间、租户、输入长度和候选数,并提供超时降级。
  2. 问题(原理题):ngram(多元切分)为何是写成本换查询成本?
    • 考点:子串预计算。
    • 回答思路:用一个长度为八的词说明词项数量。
    • 详细答案:写入时把原词预切成多个连续子串并建立倒排,查询时可直接查子串词项;但每篇文档产生更多词项和关联,增加索引大小、刷新、合并和缓存压力,短粒度还会造成碰撞。
    • 进阶追问:所有全文字段都建二元切分好吗?
    • 进阶回答:不好,应只给确有包含或补全需求的字段,并用容量与误匹配数据证明收益。
  3. 问题(场景题):运单号输错一位是否直接使用 fuzzy(模糊)?
    • 考点:标识符容错与业务风险。
    • 回答思路:先精确和规则校验,再受控扩展。
    • 详细答案:先规范大小写和连接符,校验长度、前缀及校验位;精确失败后才在同租户、同渠道等硬过滤内开放编辑距离一的候选,并明确提示。最终轨迹仍回权威源核验,不能把相似号当同一运单。
    • 进阶追问:为什么数字短号更危险?
    • 进阶回答:编辑一位可命中大量真实号码,候选缺乏语义区分,既慢又可能向用户展示错误业务实体。

3.3 BM25(最佳匹配 25)公式、三文档复算与字段长度

BM25(最佳匹配 25)在单词项上的常见教学形式为:score(q,D)=IDF(q) * TF(q,D),其中 IDF(q)=ln(1+(N-df+0.5)/(df+0.5))TF(q,D)=tf*(k1+1)/(tf+k1*(1-b+b*dl/avgdl))。这里 N 是文档数,df 是 document frequency(文档频率),tf 是 term frequency(词频),dl 是字段长度,avgdl 是平均字段长度;公式变量不代表现场实现细节,具体相似度、参数、重叠词和 norm(归一化因子)编码必须按版本核对。

取 D1=无线 鼠标 鼠标 静音,D2=无线 鼠标 办公 便携 充电,D3=鼠标 垫 红色,长度分别为 4、5、3,故 avgdl=4。查询为“无线 鼠标”,取 k1=1.2b=0.75无线 出现在 D1、D2,df=2鼠标 出现在三篇,df=3

表 10:BM25(最佳匹配 25)三文档逐步计算

项目无线鼠标
IDFln(1+(3-2+0.5)/(2+0.5))=0.4700ln(1+(3-3+0.5)/(3+0.5))=0.1335
D1 的 tf,dl1,42,4
D1 的 TF2.2/(1+1.2)=1.00004.4/(2+1.2)=1.3750
D2 的 tf,dl1,51,5
D2 的长度项1.2*(0.25+0.75*5/4)=1.425同左
D2 的 TF2.2/(1+1.425)=0.90720.9072
D3 的 tf,dl0,31,3
D3 的长度项不计分1.2*(0.25+0.75*3/4)=0.975
D3 的 TF02.2/(1+0.975)=1.1139

所以 D1 得分约 0.4700*1.0000 + 0.1335*1.3750 = 0.6536;D2 得分约 0.4700*0.9072 + 0.1335*0.9072 = 0.5476;D3 得分约 0 + 0.1335*1.1139 = 0.1487,排序 D1 > D2 > D3。D1 因“鼠标”出现两次而受益,但收益饱和;D2 字段更长而受到长度归一化;“鼠标”出现在全部文档,区分力低于“无线”。

flowchart LR
  Q[查询无线 鼠标] --> DF[统计两个词的文档频率]
  DF --> IDF[计算稀有度]
  D[候选文档] --> TF[读取词频与字段长度]
  TF --> SAT[词频饱和与长度归一化]
  IDF --> SUM[逐词求和]
  SAT --> SUM
  SUM --> K[文档一 文档二 文档三]
  B[把得分当库存正确性] -.错误解释.-> K

图 9 说明。 Q 和 DF 产生集合稀有度,D、TF、SAT 产生单文档贡献,SUM 汇总后得到排序 K。前提是候选已满足权限等硬过滤;正常路径只表达文本匹配程度;失败路径是把高分解释成库存或业务事实。业务结论是相关性分数只服务排序,不能替代数据库裁决。

数据演绎 7:BM25(最佳匹配 25)三文档排序。 输入和中间值完整列于表 10,可独立复算得到 D1=0.6536、D2=0.5476、D3=0.1487。若把 D2 的商品标题从 5 个词堆到 20 个词而目标词频不变,长度项增大、得分下降;若把“鼠标”重复 20 次,词频项会接近上限而不是增长 20 倍。该演绎用于验证解释接口与回归基线,不把小样本参数直接外推到生产。

热门面试题

  1. 问题(基础题):BM25(最佳匹配 25)为什么考虑字段长度?
    • 考点:长文本自然包含更多词的偏差。
    • 回答思路:比较短标题和长描述的偶然命中。
    • 详细答案:长字段有更多机会包含查询词,若只看词频会天然占优。长度归一化用当前长度相对平均长度调节贡献,使短而聚焦的标题不被长描述中的偶然命中轻易压过,强度由参数控制。
    • 进阶追问:长度归一化越强越好吗?
    • 进阶回答:不一定,报警长描述可能含关键上下文;参数需按字段和标注集验证,不能全局凭感觉调大。
  2. 问题(原理题):高频词为何区分力较低?
    • 考点:逆文档频率。
    • 回答思路:用“鼠标”覆盖三篇说明。
    • 详细答案:当词项出现在多数文档中,它不能有效区分哪篇更符合意图,IDF(逆文档频率)贡献因此较低;稀有但真实相关的词更能缩小集合。极稀有噪声也不一定有业务价值,仍需字段与质量治理。
    • 进阶追问:是否应删除所有高频词?
    • 进阶回答:不能,高频词可能参与短语、品牌或否定语义;是否停用要看任务和评测。
  3. 问题(场景题):得分解释与手算不同怎么排查?
    • 考点:实现参数和字段统计。
    • 回答思路:核对分析、相似度、统计范围和权重。
    • 详细答案:先确认查询词元、目标字段、实际 tfdfdl 和平均长度,再核对相似度参数、分片统计、boost(权重)、复合查询与函数评分。使用解释接口抽样,不把教学公式当成版本实现的逐位承诺。
    • 进阶追问:解释接口能否对全量请求开启?
    • 进阶回答:通常成本较高,应在抽样、离线或故障诊断中使用,并限制候选与并发。

4. 召回、重排与质量治理

4.1 查询意图、多路召回、BM25(最佳匹配 25)与业务重排

完整搜索链不是“一条查询语句”,而是查询意图识别 -> 规范化与分词 -> 多路召回 -> 候选合并 -> BM25(最佳匹配 25)或向量相似度初排 -> 业务重排 -> 权限、库存与可用性硬过滤 -> 去重 -> 返回。运单号精确路、商品中文全文路、渠道别名路、前缀容错路和 vector retrieval(向量召回)路各自解决不同意图;向量适合语义近似和表达差异,不擅长精确单号、权限、库存裁决与可解释硬条件。混合检索先限制各路候选,再归一化或学习融合,不能把不可比较的原始分数直接相加。

boost(权重)可提升字段或子句的相对贡献;function score(函数评分)可叠加销量、服务等级、时间衰减等业务信号。时间衰减应使用有业务含义的时间并设下限,防止旧但准确的轨迹消失;销量权重需防头部固化;库存只应作为硬过滤或明确降权信号,最终可售仍回 WMS(仓储管理系统)。脚本评分对每个候选执行动态逻辑,候选过大或脚本昂贵会拖垮尾延迟,优先把稳定信号预计算为数值字段,并只对有限候选重排。相关性高表示“更像查询”,不表示“有库存、可发货、已授权或轨迹正确”。

flowchart LR
  I[查询意图] --> A[规范化与分词]
  A --> E[运单号精确召回]
  A --> T[中文全文召回]
  A --> S[同义词与前缀召回]
  A --> V[向量语义召回]
  E --> C[候选集合并]
  T --> C
  S --> C
  V --> C
  C --> P[文本与向量初排]
  P --> B[业务重排]
  B --> F[权限 库存 可用性过滤]
  F --> D[业务键去重]
  D --> R[返回]
  X[全库向量精排] -.成本失控.-> P
  Y[过滤放在返回之后] -.泄漏.-> R

图 10 说明。 I 与 A 确定查询表示,E、T、S、V 是边界不同的召回节点,C 到 P 压缩候选,B 注入业务排序,F 与 D 保证硬约束和唯一结果。前提是各路候选上限、分数融合和超时已定义;正常路径逐级缩小集合;失败路径是全库昂贵精排或返回后才做权限过滤。业务结论是召回和排序是双目标,硬约束不能被高分覆盖。

sequenceDiagram
  participant U as 用户
  participant G as 查询编排器
  participant K as 精确与全文召回
  participant V as 向量召回
  participant R as 重排器
  participant P as 权限与库存服务
  U->>G: 输入运单号或商品描述
  par 多路有限候选
    G->>K: 精确 前缀 全文候选各取局部结果
    G->>V: 语义候选取有限结果
  end
  K-->>G: 文本候选与分数
  V-->>G: 向量候选与距离
  G->>R: 归一化合并后只重排候选集
  R->>P: 批量校验租户 库存 可用性
  P-->>R: 硬过滤结果
  R-->>U: 去重后的全局结果
  alt 任一路超时
    G-->>U: 降级到精确与全文并标记召回代际
  end

图 11 说明。 U 发起请求,G 并行调用 K、V,R 只处理压缩后的候选,P 执行不可绕过的硬过滤。前提是并行路有独立超时和降级;正常路径把有限候选归一化后重排;失败路径在向量或扩召超时时回到精确与全文,不能返回未过滤结果。业务结论是混合检索的价值来自互补召回,成本边界来自候选集压缩。

表 11:召回、评分与重排信号边界

信号进入阶段适合解决不能承担风险控制
运单号精确命中召回与强提升标识符定位轨迹状态裁决完整键、租户过滤、回源
BM25(最佳匹配 25)文本初排词项稀有度、频次、长度库存和授权字段权重、标注集回归
vector retrieval(向量召回)辅助召回语义改写、相似报警精确编码和硬条件候选上限、模型版本、降级
boost(权重)初排或融合强调标题、精确命中修复错误分词控制幅度、解释抽样
function score(函数评分)业务重排时间、销量、服务等级业务事实写入预计算、饱和、衰减下限
权限与库存硬过滤合法可见与可售边界文本相关性批量校验、默认拒绝、回源
业务键去重多路和多版本合并判断最新事实版本、来源水位、稳定键

数据演绎 8:分治局部 Top-K(最高 K 个结果)与候选压缩。 8 个分片各有 100 万篇文档,目标全局前 20。每分片先取局部 100 条,共 800 条由协调端归并,再对前 200 条做业务重排,成本远小于对 800 万篇执行脚本。边界是局部打分与全局目标必须足够一致;若重排信号会让局部第 500 名跃升为全局第一,只取 100 会永久丢失它。此时要增大候选、做分阶段上界剪枝或把稳定信号前移。分治只有局部候选可压缩且全局归并可控时才提速。

热门面试题

  1. 问题(基础题):召回与排序为什么是两个目标?
    • 考点:候选覆盖和前列质量。
    • 回答思路:先保证相关文档进入集合,再决定顺序。
    • 详细答案:召回解决“相关文档是否进入候选”,排序解决“进入候选后谁排在前面”。只优化排序救不回未召回文档,只扩大召回又会增加噪声和成本,因此要用 Recall(召回率)与前列指标共同约束。
    • 进阶追问:零结果率下降是否证明质量提高?
    • 进阶回答:不证明,可能只是放宽到大量误匹配;还要看准确率、首位质量、转化与投诉守护指标。
  2. 问题(原理题):分治局部 Top-K(最高 K 个结果)何时可能漏掉全局好结果?
    • 考点:局部剪枝与重排不一致。
    • 回答思路:用后置业务信号造成名次跃迁说明。
    • 详细答案:若分片局部只按文本分数截断,而全局重排依赖局部阶段未知的强业务信号,被截掉的低文本分文档可能本应跃升。候选深度必须覆盖这种名次变化,或把可预计算信号前移并建立上界。
    • 进阶追问:局部候选越多越安全吗?
    • 进阶回答:召回风险降低,但网络、协调堆和重排成本上升,要用离线回放找到质量与成本拐点。
  3. 问题(场景题):脚本评分超时怎样治理?
    • 考点:候选规模、脚本复杂度与降级。
    • 回答思路:先限制候选和隔离,再预计算稳定信号。
    • 详细答案:第一类证据看慢查询、脚本执行时间、候选数和查询阶段,第二类证据看处理器、线程池、堆和高分位。止血关闭脚本或只保留精确全文初排;长期把销量、时间和等级预计算为数值字段,只对有限候选重排并设超时。
    • 进阶追问:增加节点能根治吗?
    • 进阶回答:只能暂时增加资源,若每篇候选都执行昂贵逻辑,流量增长后仍会失控,必须改变执行规模和计算位置。

4.2 Precision(准确率)、Recall(召回率)、MRR(平均倒数排名)、NDCG(归一化折损累计增益)与安全发布

搜索质量先构造带查询、候选、相关等级、租户和时间的标注集。Precision(准确率)=返回相关数/返回数,Recall(召回率)=返回相关数/全部相关数;MRR(平均倒数排名)只关心第一个相关结果的倒数名次,适合运单号和唯一答案;NDCG(归一化折损累计增益)按位置折损并支持多级相关,适合商品列表。零结果率观察覆盖,点击率和转化率观察线上行为,但点击受位置、展示、价格和库存影响,不能直接等同相关性。离线评测可快速复放稳定查询集,在线 A/B Test(对照实验)检验真实用户因果差异;反事实评估尝试用历史日志估计未展示策略,必须处理曝光倾向和位置偏差。

同义词、词典或分析器发布要版本化。查询端词典可灰度,但节点代际必须可观测;索引端规则变化会改变落盘词项,常需新索引全量重建。标准路径是冻结映射与词典版本 -> 创建新索引 -> 从数据库或事件日志全量导入 -> 追增量水位 -> 影子查询 -> 比较结果集合、排序、权限和高分位 -> 灰度切别名 -> 观察业务指标与守护指标 -> 异常切回旧别名。旧索引在回滚窗口保留只读,数据库和事件日志始终是权威源。

flowchart TB
  L[标注集] --> O[离线评测]
  O --> P[准确率与召回率]
  O --> M[首位倒数排名]
  O --> N[位置折损增益]
  O --> G{达到离线门槛}
  G -->|是| A[在线对照实验]
  G -->|否| X[修正召回与排序]
  A --> C[点击与转化目标]
  A --> S[零结果 延迟 越权 投诉守护]
  C --> D{目标提升且守护不退化}
  S --> D
  D -->|是| R[扩大流量]
  D -->|否| B[回滚并分析位置偏差]

图 12 说明。 L 到 O 建立可重复离线基线,P、M、N 分别覆盖集合和位置质量,G 控制进入线上,A 同时观察业务目标 C 与守护指标 S。前提是标注集有代表性且实验分流稳定;正常路径双门槛通过后扩大;失败路径在任一守护退化时回滚。业务结论是指标必须与业务目标和安全守护共同使用。

sequenceDiagram
  participant D as 权威数据库与事件日志
  participant O as 旧索引与旧词典
  participant N as 新索引与新词典
  participant H as 影子查询比较器
  participant A as 读别名
  participant M as 监控与回滚器
  D->>N: 全量导入并记录起始水位
  D->>N: 持续追增量与删除
  H->>O: 回放真实查询
  H->>N: 同请求同权限影子查询
  O-->>H: 旧结果与耗时
  N-->>H: 新结果与耗时
  H->>M: 集合 排序 权限 延迟差异
  alt 差异通过门槛
    A->>N: 灰度切换读流量
    M->>A: 逐级扩大
  else 词典灰度失败或相关性回归
    M->>A: 切回旧索引
    A->>O: 恢复旧读路径
    D->>N: 保留水位继续修复
  end

图 13 说明。 D 是唯一权威源,O 与 N 是可重建代际,H 以同请求和同权限比较,A 承担原子读切换,M 根据差异控制灰度与回滚。前提是新索引追平增量并包含删除、权限和词典版本;正常路径由影子到小流量再扩大;失败路径遇到词典漂移或相关性回归立即切回 O,新索引保留修复。业务结论是双索引发布把不可逆重建变成可回滚读切换。

表 12:搜索质量指标、偏差与使用边界

指标回答的问题适合场景主要偏差与守护
Precision(准确率)返回结果中多少相关前十商品与报警列表未标注相关文档会低估
Recall(召回率)全部相关文档找到多少同义词与多路召回全部相关集合难完整获得
MRR(平均倒数排名)第一个相关结果多靠前运单号、唯一 SKU(库存单位)忽略首个结果之后的质量
NDCG(归一化折损累计增益)多级相关结果位置是否合理商品和渠道列表依赖等级标注一致性
零结果率查询是否完全无候选覆盖监控低零结果可能由噪声换来
点击率用户是否点击展示在线反馈位置、文案和曝光偏差
转化率搜索是否促成业务目标商品、物流服务选择价格、库存和活动混杂
A/B Test(对照实验)新策略是否造成增量灰度决策串组、样本量和新奇效应
反事实评估历史日志下策略可能怎样上线前筛选倾向估计错会产生偏差

数据演绎 9:离线排序指标。 查询 Q1 的相关等级按理想顺序为 [3,2,1],新策略前五为 [0,3,1,2,0]。第一个相关结果在第 2 位,所以倒数排名为 1/2=0.5;折损累计增益按 gain=2^rel-1、位置折损 log2(rank+1) 计算,再除以理想值获得 NDCG(归一化折损累计增益)。Q2 首位相关则倒数排名为 1,两查询 MRR(平均倒数排名)=(0.5+1)/2=0.75。这比“有结果”更能暴露首位错排。

数据演绎 10:双索引灰度与相关性回归。 影子流量 10 万次查询中,新旧前十集合差异 18%,其中同义词预期扩召 12%,权限差异必须为 0;新索引 NDCG(归一化折损累计增益)从 0.72 升到 0.76,但运单号 MRR(平均倒数排名)从 0.98 降到 0.91,高分位从 180 毫秒升到 430 毫秒。即使总体指标上升也不得扩流,因为精确单号和延迟守护退化。回滚读别名,按意图拆分权重并压缩候选后重新影子验证。

热门面试题

  1. 问题(基础题):MRR(平均倒数排名)与 NDCG(归一化折损累计增益)怎样选择?
    • 考点:单个首要答案与多级列表。
    • 回答思路:按业务结果形态区分。
    • 详细答案:当用户主要寻找唯一运单或首个正确 SKU(库存单位)时,MRR(平均倒数排名)直观衡量首个相关结果位置;当多个商品都有不同相关等级时,NDCG(归一化折损累计增益)同时考虑等级和位置,更适合列表整体质量。
    • 进阶追问:点击率能替代它们吗?
    • 进阶回答:不能,点击受位置和展示影响;离线相关性指标与线上行为指标应互补,并设置延迟、越权和投诉守护。
  2. 问题(原理题):为什么更新分析器通常需要重建索引?
    • 考点:落盘词项不可变与代际一致。
    • 回答思路:从旧文档和新文档分析结果差异回答。
    • 详细答案:分析器决定写入哪些词项、词位和偏移,旧 segment(分段)不会因配置变化自动重算。原地更新会使新旧文档使用不同语义,稳定方案是新建索引全量重分析、追增量、影子比较后切别名。
    • 进阶追问:只改查询分析器也要重建吗?
    • 进阶回答:不一定,但必须证明新查询词元与旧索引兼容,并评估扩展成本、排序和节点词典一致性。
  3. 问题(场景题):A/B Test(对照实验)点击率升高但转化下降怎么办?
    • 考点:目标冲突、位置偏差和守护指标。
    • 回答思路:停止扩流并按意图、位置和库存拆解。
    • 详细答案:先确认分流、曝光与样本量,再分查询意图、位置、设备、库存和租户比较。可能是标题党结果提高点击却降低可购买性,也可能是首位偏差。转化属于业务目标时应停止扩流,结合标注集和会话漏斗修正。
    • 进阶追问:总体转化持平可以忽略小租户下降吗?
    • 进阶回答:不能,需检查租户和关键业务分层守护,平均值可能掩盖权限、渠道或高价值用户退化。

5. 排障、项目闭环与版本核对

5.1 搜索事故五段式、项目边界、设计思想与版本核对卡

搜索事故统一按“现象定界 -> 两类证据 -> 可逆止血 -> 根因修复 -> 同语料回归”处理。第一类是搜索链证据:原始查询、逐阶段词元、字段与映射、倒排解释、候选数、过滤、得分、慢查询、索引和词典代际;第二类是业务与资源证据:权威数据库样本、事件水位、权限决策、库存状态,以及处理器、堆、磁盘、线程池和高分位。只看“结果不对”无法区分数据未同步、分析不一致、查询语义、评分回归和越权。

sequenceDiagram
  participant U as 用户
  participant Q as 查询服务
  participant A as 分析与召回
  participant I as 搜索索引
  participant D as 权威数据库与事件日志
  participant M as 事故处置
  U->>Q: 商品名查询返回零结果
  Q->>A: 保存原文与逐阶段词元
  A->>I: 检查索引词项 文档版本 水位
  M->>D: 核对权威文档与删除状态
  D-->>M: 文档存在且版本更新
  I-->>M: 索引水位落后或词项不兼容
  alt 权威精确键可回源
    Q->>D: 限流回源关键查询
    D-->>U: 返回可验证事实
  else 全文能力不可替代
    Q-->>U: 明确降级而非编造结果
  end
  M->>I: 回放事件或重建新索引
  M->>Q: 用事故语料和反例回归

图 14 说明。 U 到 Q 是故障入口,A、I 给出搜索链证据,D 提供权威事实证据,M 负责止血与修复。前提是请求、文档版本和事件水位可关联;正常处置先区分数据缺失与词项不兼容;失败能力只允许限流回源精确键或明确降级。业务结论是零结果不能靠无边界扩召掩盖,必须回到权威事实和分析链定位。

sequenceDiagram
  participant U as 运营用户
  participant S as 搜索服务
  participant C as 过滤缓存
  participant P as 权限服务
  participant I as 索引
  U->>S: 租户甲查询仓库商品
  S->>P: 获取租户甲数据域与版本
  P-->>S: 仓库一 权限版本九
  S->>C: 查租户甲加版本九的过滤位集
  C-->>S: 命中或重新计算
  S->>I: 权限硬过滤后检索
  I-->>U: 只返回仓库一
  alt 缓存键遗漏租户或权限版本
    C--xS: 复用租户乙旧位集
    S--xU: 返回未授权仓库
  end
  S->>P: 越权事件立即复核
  P-->>S: 默认拒绝并失效相关缓存

图 15 说明。 U、S、P 建立当前授权,C 只能缓存带租户与权限版本的过滤结果,I 在召回与返回前执行硬过滤。前提是授权变化可生成单调版本并使缓存失效;正常路径缓存命中不改变权限语义;失败路径是缓存键缺少租户或版本导致跨租户复用。业务结论是缓存优化永远不能放宽默认拒绝,越权属于安全事故而非普通相关性问题。

表 13:生产搜索故障证据、止血、修复与回归矩阵

故障第一类证据第二类证据可逆止血长期修复与回归
零结果原文、逐阶段词元、目标字段、索引代际权威文档、事件水位、删除状态精确键限流回源;全文明确降级修复同步或分析兼容;回放事故查询和反例
错误匹配命中词项、词位、子句、得分解释用户意图、标注等级、投诉样本关闭高噪声同义词或模糊路调整词典、字段和门槛;验证准确率与召回率
分词不一致索引与查询逐阶段输出、词典摘要节点、镜像、插件与配置代际回滚到统一分析代际双索引重建;节点逐一对拍
字段爆炸字段数、映射变更、拒绝与状态大小动态键来源、异常租户和文档样本拒绝未知字段并隔离写入白名单或受控键值模型;重建和容量回归
脚本评分慢候选数、脚本耗时、慢查询和调用次数处理器、线程池、堆与高分位关闭脚本,退回文本初排预计算稳定信号;只重排有限候选并压测
高基数过滤过滤选择率、位集构造、分段与查询频率租户分布、权限集合大小、堆与处理器限制组合条件,按租户隔离热点优化字段与路由;冷热和并发矩阵回归
深分页页深、每分片候选、协调堆和排序字段网关超时、网络与用户导出行为禁止深偏移,改有界游标或异步导出稳定排序与时间点视图;断点、重复和遗漏回归
缓存误判缓存键、命中率、分段代际、权限版本授权日志、租户样本、内存和变更频率失效缓存并默认拒绝完整键和版本化失效;跨租户安全回归
相关性回归新旧前十差异、解释、词典和模型代际标注集、点击、转化、投诉与意图分桶切回旧别名或旧排序策略修正后影子查询与对照实验双门槛
热点查询查询指纹、频率、候选与目标分片处理器、堆、磁盘、线程池和来源用户限流、熔断昂贵路、保护精确查询预计算、请求合并、租户配额和峰值回归
重建失败分区断点、失败样本、索引计数与增量水位权威快照、事件保留、磁盘和网络停止切流,保留旧索引与恢复点从稳定断点重试;校验版本、删除、权限和查询

数据演绎 11:事故组合与权限泄漏。 零结果样本 1000 条中,420 条来自新商品事件水位落后,310 条来自查询分析器把完整渠道词切碎,270 条是真实无结果;止血只对精确 SKU(库存单位)限流回源,不能把门槛统一降为 1。错误匹配中,二元短词把“机”扩到 8 万候选,关闭该路后候选降到 900。过滤缓存命中率虽有 95%,但缓存键漏租户造成 3 条越权,立即全量失效并默认拒绝。脚本评分对 5 万候选每篇耗时 0.08 毫秒,理论处理器时间约 4 秒;把候选压到 300 且预计算时间衰减后降到约 24 毫秒。回归必须验证越权为 0、事故查询排序、非事故反例、高分位和事件水位。

跨境物流把运单号、渠道标准名、历史别名和轨迹文本分字段建模,搜索用于定位,最终轨迹和渠道有效性回数据库或事件日志;WMS(仓储管理系统)把 SKU(库存单位)精确字段、商品中文全文和拼音辅助字段分开,库存、防超卖和价格由权威服务裁决;IoT(物联网)报警文本可用领域同义词与相似报警辅助召回,但报警确认、抑制和关闭必须写权威事件与处置流水;运营后台把租户、仓库、角色和数据域作为不可绕过的精确过滤,任何相关性策略都不能提升未授权文档。

设计主线有五条:搜索不是“有结果”而是召回与排序双目标;预计算索引用空间和写放大换低延迟;同义词扩召会牺牲准确率,必须由标注集和线上守护约束;分治只有局部候选可压缩且全局归并可控时才提速;指标必须与业务目标、权限、延迟、投诉和资源守护共同使用。数据库与事件日志始终是权威源,索引可删除、可回放、可重建。

版本核对卡。 项目版本、学习基线、分析插件、中文词典、同义词装载、默认相似度、BM25(最佳匹配 25)参数、词位与 norm(归一化因子)行为、过滤缓存资格、脚本评分限制、向量字段与融合、别名切换、重建接口均标记“待现场核对”。核对时记录部署镜像或软件包、插件校验值、配置、索引映射、词典摘要、官方章节、最小实验输入输出、核对日期、适用边界、升级条件和回滚索引。最小实验至少包含索引与查询分析对拍、三文档得分解释、词典节点灰度、权限变更缓存失效、脚本超时降级和双索引回滚。

倒排索引分析、召回、评分、灰度与回滚全链路

正式图说明。 四个泳道依次是权威源与索引期、查询期与多路召回、评分重排与硬过滤、影子比较与灰度;实线箭头表示文档或查询在正常链路中的交接,条件菱形控制分析兼容、权限失败、词典代际和质量门槛。前提是数据库或事件日志带业务键、版本、删除和水位,新旧索引均可由其重建。正常路径从索引分析进入新索引,查询经精确、全文、同义词和向量多路召回,再经 BM25(最佳匹配 25)、业务重排、权限库存过滤和影子验证切向新别名。失败路径一在索引与查询分析器不兼容时回到旧查询分析器;失败路径二在权限或脚本超时时默认拒绝并降级;失败路径三在词典灰度或相关性门槛失败时切回旧索引,同时保留新索引水位继续修复。业务结论是召回性能、相关性和发布速度均不能越过权威事实与权限边界。

热门面试题

  1. 问题(基础题):搜索故障为什么必须要两类证据?
    • 考点:搜索链与业务事实交叉验证。
    • 回答思路:区分“索引怎样返回”和“结果是否真实合法”。
    • 详细答案:搜索链证据定位分析、召回、评分、过滤和资源问题;业务证据确认权威文档、事件水位、库存与权限。只有前者可能把索引滞后当真实删除,只有后者又无法解释为何候选错排,两类必须对齐请求与版本。
    • 进阶追问:搜索结果和数据库不一致听谁的?
    • 进阶回答:业务裁决听数据库或事件日志,搜索索引按事件水位修复或重建,禁止反向覆盖权威事实。
  2. 问题(原理题):过滤缓存为什么可能成为权限泄漏源?
    • 考点:缓存键、版本和默认拒绝。
    • 回答思路:用跨租户复用旧位集解释。
    • 详细答案:若缓存键未包含租户、数据域、权限版本或索引代际,授权变化后可能复用旧过滤集合,甚至跨租户返回文档。缓存只优化执行,键不完整时必须失效并默认拒绝,不能回退为无过滤查询。
    • 进阶追问:越权文档被去重掉是否算安全?
    • 进阶回答:不算,去重不承担授权;越权候选可能进入高亮、计数、日志或侧信道,必须在可见结果形成前硬过滤。
  3. 问题(场景题):项目版本未知时怎样给出可信方案?
    • 考点:稳定机制与版本敏感行为分层。
    • 回答思路:机制可讲,默认值和接口必须核对。
    • 详细答案:明确项目版本“待现场核对”,稳定说明倒排、分析、不可变分段、候选和评分机制;对分析插件、词典装载、缓存、脚本、向量与别名行为建立核对卡,用现场配置、官方章节和最小实验确认,不声称最新版默认安全。
    • 进阶追问:最小实验能替代真实压测吗?
    • 进阶回答:不能,最小实验验证机制和边界,容量、候选、尾延迟与重建窗口仍需真实语料和并发压测。

题库边界

以下 30 道题用于完整口述,不计入 12 个知识型三级小节和 36 道章节六字段题;每题链接回本篇真实详情章节。

6. 综合口述题库

  1. 问题:请从三篇商品文档完整讲清倒排索引如何构造和查询。

    • 口述答案:我会先固定语料和编号,避免只背名词。D1 是“红色 无线 鼠标 静音”,D2 是“无线 鼠标 办公”,D3 是“红色 鼠标 垫”。写入时先经字符规范、分词和词元过滤,得到词元、position(词位)与 offset(偏移量);再按词项排序形成 term dictionary(词项字典),每个入口指向 postings list(倒排表)。例如“无线”的倒排表是 D1 与 D2,“静音”只有 D1,“鼠标”有三篇,所以对应 document frequency(文档频率)分别为 2、1、3。每个文档项还可保存 term frequency(词频)、词位和偏移,字段长度等评分信号压缩为 norm(归一化因子)。查询“无线 AND 静音”不扫描三篇原文,而是定位两个词项入口,按有序文档编号求交得到 D1;“无线 OR 静音”求并得到 D1、D2。长倒排表可用 skip data(跳跃数据)跨过不可能相交的编号区间,但短表上跳点读取可能得不偿失。短语“无线 鼠标”还要核对两个词位是否相邻,高亮则使用字符偏移回到原文。这个结构本质是写入时把一篇文档拆成多条词项关联,用磁盘、分析和合并写放大换查询期只读少量倒排表;是否保存词位、偏移和归一化信号要由短语、高亮与评分契约决定,关闭后恢复通常需要重建。项目里搜索索引只是可重建投影,商品库存和价格仍由 WMS(仓储管理系统)权威库裁决。验收时我还会用朴素扫描与跳跃求交对拍,注入重复词、空字段、删除文档和长倒排表,核对集合、词位、高亮及空间增量;任何漏文档都先停用优化路径,而不是修改权威数据迎合索引。
    • 追问:document frequency(文档频率)与总词频有何不同?
    • 直接回答:前者只数包含该词的文档数,后者会累计所有出现次数;逆文档频率使用前者衡量区分度。
    • 追问:词位和偏移能否只存一个?
    • 直接回答:不能互相替代,词位服务顺序与邻接,偏移服务原文字符区间和高亮。
    • 追问:跳跃一定更快吗?
    • 直接回答:不一定,只有倒排表足够长且交集稀疏时更可能抵消跳点空间与解码成本。
    • 详情:倒排结构与样例
  2. 问题:倒排索引和 B-Tree(平衡树索引)在项目中怎样分工?

    • 口述答案:我不会把两者说成互相替代,而是先看查询目标。B-Tree(平衡树索引)把完整可比较键按顺序组织,沿树高定位叶子后做等值、范围或有序扫描,适合运单号、SKU(库存单位)、租户标识、创建时间和数据库唯一约束。倒排索引把一个文档拆成多个词项,每个词项指向文档集合,适合商品名、渠道别名、轨迹描述和 IoT(物联网)报警文本的多词召回、短语和相关性。比如查询完整运单号 CN-9388,权威库的有序键或搜索中的 keyword(精确字段)能稳定命中;查询“红色无线静音鼠标”,只用完整字符串有序键无法自然拆词,倒排索引可以取“红色、无线、静音、鼠标”的倒排表组合。反过来,若运单号只放 text(全文字段),连字符、大小写或短词规则可能把标识切碎,导致漏召回和误匹配。所以搜索投影常把同一原值做多字段:精确视图负责过滤、去重和聚合,全文视图负责含义召回,受控前缀负责输入未完成。代价上,有序树承担页分裂、重平衡和回表,倒排承担分词、多字段、不可变 segment(分段)、删除标记和 merge(合并)。最终库存扣减、轨迹状态、渠道有效性和权限仍由数据库或事件日志裁决,搜索只提供低延迟候选;命中搜索不能证明业务事实正确。容量评审还会分别记录两类索引的键数量、单次写放大、缓存命中、返回比例和回表或取文档成本,并用精确键、范围、多词与混合查询四组基准验证,防止只凭一次快查询决定数据结构。
    • 追问:SKU(库存单位)需要模糊搜索怎么办?
    • 直接回答:保留完整精确字段,再增加受控前缀或多元切分子字段,最终按完整 SKU(库存单位)回源确认。
    • 追问:倒排索引为何不承担唯一约束?
    • 直接回答:它面向可重建召回和近实时可见,不是交易提交时维护业务不变量的权威事务边界。
    • 追问:商品名能否只放 keyword(精确字段)?
    • 直接回答:可以做完整值过滤,却不能有效支持中文切词、同义表达和多词相关性。
    • 详情:两类索引边界
  3. 问题:Lucene(全文检索库)不可变 segment(分段)如何支持更新和近实时搜索?

    • 口述答案:不可变指已经发布的 segment(分段)不原地改写,不代表业务文档不能更新。新文档先进入内存索引缓冲,经过 index analyzer(索引分析器)生成词项、倒排项和字段结构;refresh(刷新)把当前缓冲发布成新 segment(分段),新搜索器打开它后普通搜索才近实时可见。更新一篇商品文档时,旧文档先被逻辑删除标记,新版本写入新段,因此合并前新旧物理版本可能共存;查询视图排除已删除旧版,但磁盘不会立即下降。merge(合并)在后台读取多个小段,重写词典、倒排和列式结构,跳过删除项,成功切换后旧段才可回收。这样搜索线程读取稳定结构,缓存也可围绕不变段复用,代价是刷新产生小段、更新产生重复版本、合并消耗磁盘输入输出、处理器和临时空间。若每秒 5000 条报警且一秒刷新,十分钟会产生约 600 个刷新批次;把普通明细放宽到十秒能显著减少小段,而严重报警可走独立短刷新摘要。排障要分清写入确认、搜索可见、持久化提交和合并回收四个时间点。合并积压时先看刷新、批次、更新率、段数、删除比例和磁盘余量,不能盲目提高并发与查询争盘。搜索索引落后时,精确业务键可限流回源,业务更新仍写权威数据库或事件日志。恢复签收会比较新旧段数、删除比例、合并字节、搜索可见延迟和权威事件水位,并在低磁盘与高更新率下复测,确保刷新策略没有破坏严重报警的新鲜度目标。此外,段合并策略和刷新目标都纳入容量评审,变更前后必须保存可比基线。
    • 追问:refresh(刷新)成功是否代表旧段已删除?
    • 直接回答:不代表,它只让新段对搜索器可见,旧段回收依赖删除可见、引用释放和后续合并。
    • 追问:删除后为何磁盘可能继续上涨?
    • 直接回答:删除先是逻辑标记,更新新版本和合并临时输出还会占额外空间,真正回收有延迟。
    • 追问:近实时可见是否等于业务提交?
    • 直接回答:不等于,搜索可见是读模型时间点,库存、支付或轨迹提交由各自权威源定义。
    • 详情:不可变分段
  4. 问题:请解释完整分析链,并演绎运单号与中文商品名混合输入。

    • 口述答案:分析链固定从 character filter(字符过滤器)到 tokenizer(分词器),再到 token filter(词元过滤器)。字符过滤器处理字符流,比如把全角 ABC-9388 规范为 ABC-9388、清理标签并维护偏移修正;分词器决定边界,应把运单号整体保留,同时把中文商品名“红色静音鼠标”切成有业务意义的词;词元过滤器再做小写、停用词、同义词或拼音等变换。顺序不能任意交换,因为先错误切碎 ABC-9388 后再小写,已无法恢复完整标识;字符替换不维护 offset(偏移量),高亮会错位;停用词过早删除也可能破坏多词同义词和否定语义。对混合查询 CN-9388 红色鼠标,我先做意图识别:看起来像运单号的部分进入 tracking_no.keyword 精确路,中文部分进入 product_name.text 分析路,两路候选按稳定业务键合并。精确命中的同租户运单获得强提升,商品名候选保持较低权重;权限和可用性仍是硬过滤。验收语料至少覆盖全半角、不同连字符、大小写、前导零、渠道专名、单字品牌和中文复合词,并保存每个阶段的词元、词位与偏移。不能把整串丢给同一个中文分词器,否则单号被切碎;也不能全部走精确字段,否则中文部分零结果。分析链改动必须带词典代际、影子比较和回滚方案。我会把每条样例的原文、阶段输出、位置、偏移和目标字段固化为回归夹具,再增加不应命中的相邻单号与商品反例;上线后按输入形态监控零结果、候选量和高亮错位,避免平均值掩盖标识符退化。若阶段输出无法复现,就不允许把问题归因给用户输入。
    • 追问:为什么字符过滤器要维护偏移修正?
    • 直接回答:后续词元偏移需要映射回原文,若删除或替换字符不修正,高亮和命中解释会指向错误区间。
    • 追问:中文分词越细召回越好吗?
    • 直接回答:召回可能增加,但短词碰撞、候选规模和错误匹配也会上升,必须用标注集约束。
    • 追问:混合查询如何保证单号不被商品召回淹没?
    • 直接回答:先识别标识符并走精确字段,赋予明确优先级,再在同租户硬过滤内融合全文候选。
    • 详情:分析链
  5. 问题index analyzer(索引分析器)和 search analyzer(搜索分析器)不一致会发生什么?

    • 口述答案:索引分析器决定文档最终写入哪些词项、词位和偏移,搜索分析器决定用户输入变成哪些查询词项。两者可以配置不同,但必须语义兼容,也就是查询词项能与落盘词项相交,短语需要的词位图也一致。假设索引把“国际快递”切成“国际、快递”,搜索端却只生成完整词项“国际快递”,词典中没有该项就会零结果;反过来,搜索端把一个短词扩成十几个同义词,虽然提高 Recall(召回率),也会扩大布尔子句、候选和误匹配。查询端同义词便于快速更新,旧索引无需立刻改写,但每次查询承担扩展成本;索引端展开查询较轻,却把规则固化进不可变 segment(分段),词典更新后旧文档不会自动补词,通常要双索引重建。线上结果漂移时,我会按请求记录节点、分析器名、索引代际和词典摘要,对同一输入逐节点执行分析并比较候选;若只有部分节点加载新词典,立即停止灰度并回到统一代际。修复不是简单重启全部节点,而是确定词典版本、原子装载方式、失败节点隔离和回滚。回归同时覆盖预期同义词、非同义反例、短语、零结果、高分位和候选数。索引端规则变化走新索引全量重分析、追增量和别名切换,数据库与事件日志提供可重复输入,不能从旧错误索引复制后宣称修复。发布门槛还包括所有查询节点报告同一词典摘要,滚动过程中的新旧代际请求有确定路由或隔离;若无法保证,就暂停装载而不是让负载均衡随机决定搜索语义,回归结果同时记录节点与索引代际。
    • 追问:两条分析链必须完全相同吗?
    • 直接回答:不必完全相同,例如查询端可扩同义词,但落盘词项、查询词项和词位语义必须兼容。
    • 追问:只改查询端为何也要灰度?
    • 直接回答:它会改变扩展词、候选规模、排序和延迟,节点代际不一致还会造成相同请求结果漂移。
    • 追问:索引端词典更新为什么不能自动影响旧段?
    • 直接回答:旧段已经保存历史分析结果且不可变,必须重写文档才能产生新词项。
    • 详情:分析器一致性
  6. 问题:中文同义词扩召怎样平衡 Precision(准确率)和 Recall(召回率)?

    • 口述答案:我先把同义词看作有代价的候选扩展,而不是质量开关。以 100 篇真实相关“手机壳”文档为例,原策略返回 70 篇,其中 63 篇相关,Precision(准确率)是 63/70=0.90,Recall(召回率)是 63/100=0.63。加入“保护壳、外壳”后返回 95 篇,其中 80 篇相关,召回率升到 0.80,准确率降到约 0.842;如果“外壳”还命中机器外壳,噪声会继续增加。因此词典必须带方向、字段、词性或业务域,不应把所有词双向等价。商品标题可把“手机壳 -> 保护壳”作为查询端低权重扩展,但精确品牌、类目和租户仍约束候选;渠道历史名要映射到标准渠道编码,不能扩到普通词;IoT(物联网)报警同义词还要区分现象和原因,避免把“离线”与“网络抖动”当同一事实。离线用按意图分层的标注集比较准确率、召回率、MRR(平均倒数排名)、NDCG(归一化折损累计增益)和零结果率,在线再看点击、转化、投诉和延迟守护。发布采用版本化词典、影子查询和小流量灰度,比较新旧前十集合及候选数;若召回提升却首位下降或延迟越线,立即回滚。词典维护还要记录来源、责任人、有效期和反例,热门查询变化不能直接进入全量规则。最终结论是扩召允许牺牲部分准确率,但损失必须被业务目标接受且不触碰权限、库存与事实边界。我还会为每条规则设置命中量和候选放大告警,低频规则定期复核,歧义词按类目或渠道上下文启用;没有稳定收益或反例持续增长的规则应删除,而不是永久累积。
    • 追问:同义词是否都应双向展开?
    • 直接回答:不应,简称到标准名常适合单向映射,双向可能把精确术语扩成歧义普通词。
    • 追问:零结果率下降能否证明扩召成功?
    • 直接回答:不能,可能只是返回更多无关文档,还要看准确率、首位质量、转化、投诉和成本。
    • 追问:词典由谁维护?
    • 直接回答:搜索工程与业务共同维护,规则需有语料证据、版本、责任人、反例和回滚记录。
    • 详情:同义词边界
  7. 问题:text(全文字段)、keyword(精确字段)和多字段如何建模?

    • 口述答案:字段建模从操作而不是原始类型出发。text(全文字段)用于分词召回、短语和相关性;keyword(精确字段)保留完整值,用于过滤、排序、聚合、去重和权限。同一原始字段可以做 multi-field(多字段),但每个子字段都要有明确入口和容量预算。跨境运单号主视图是完整精确值,可增加受控前缀容错,不能只用中文全文;渠道名可同时有标准编码、中文全文、历史别名和低权重拼音;WMS(仓储管理系统)商品名可有中文全文、原始精确名和拼音辅助,SKU(库存单位)保留完整键;IoT(物联网)报警描述做全文,设备、租户、级别和规则编码做精确字段;运营权限字段绝不分词。规范化也要按字段区分:全半角和大小写折叠可能适合渠道简称,运单校验位和 SKU(库存单位)连字符不能随意删除;拼音会遇到多音字与短前缀碰撞,只能低权重辅助。多元切分可支持包含搜索,却会使一个词产生许多子串,放大磁盘、合并和短词噪声,因此只放专用字段并设置最短查询长度。动态业务属性不能无界生成字段,否则造成字段爆炸和集群状态压力,应采用白名单或受控键值模型。搜索命中后,库存、价格、轨迹、报警处置和授权仍回权威源校验。上线前用真实字段分布估算词项、段和列式值成本,并用查询日志证明每个子字段确实被使用。字段评审还要写清所有者、输入规范、允许查询、禁止查询、保留期和下线条件;发布后按子字段统计文档覆盖、词项数、查询率与命中贡献,长期无人使用的容错视图通过新索引移除。
    • 追问:商品名为何还需要精确子字段?
    • 直接回答:完整值去重、聚合和精确过滤需要稳定原值,不能依赖会随分析规则变化的词元。
    • 追问:拼音字段能否高权重?
    • 直接回答:通常不宜,高碰撞和多音字会制造噪声,应低于标准中文与精确品牌命中。
    • 追问:多字段越多是否体验越好?
    • 直接回答:不是,每个子字段都增加写入、磁盘、合并和候选,必须以真实意图和评测收益证明。
    • 详情:字段建模
  8. 问题termmatch、短语与布尔查询如何避免语义错误?

    • 口述答案:我先区分“用户输入是否需要分析”和“条件是相关性还是硬约束”。term 直接拿给定词项查倒排表,不执行全文分析,适合 keyword(精确字段)、租户编码和已知落盘词项;match 先经 search analyzer(搜索分析器)生成一个或多个词项,适合自然语言;phrase 还读取 position(词位),要求词项顺序和间隔符合短语。布尔查询中 must 是必须命中的相关条件,should 是可选扩召或加分,filter 是不参与相关性得分的真假约束。权限、租户、数据域和不可售状态必须进入硬过滤,绝不能放 should;缓存未命中也不能跳过过滤。minimum_should_match(最小匹配数)控制多词至少命中几个:五词查询门槛一可能因任意高频词返回海量噪声,门槛五又可能漏掉缺少修饰词的相关商品,应按有效词数和意图分桶,用标注集寻找平衡。常见错误是对全文字段用原始大写完整句执行 term,落盘词项不一致导致零结果;或把所有词都放 must,停用词和新词造成过度收缩;也有把短语容忍间隔放太大,退化成普通共现。排查保存原始输入、逐阶段词元、布尔树、目标字段、候选数和得分解释,再用权威权限样本验证结果集合。修复后既回放事故查询,也加入相邻反例,防止从漏召回摆到误召回。我会把布尔树序列化进入查询审计,抽样核对每个硬过滤是否存在、每个可选子句是否有上限,并在词数一到十、含停用词和含专名的参数矩阵中观察门槛变化,确保规则可解释且可回滚。
    • 追问filter 是否一定命中缓存?
    • 直接回答:不一定,它只声明不评分;缓存资格还受版本、频率、分段、选择率和查询形状影响。
    • 追问:权限过滤为何不能放重排后?
    • 直接回答:未授权文档可能已进入高亮、计数、日志或侧信道,授权必须在可见结果形成前执行。
    • 追问:短语查询为什么更贵?
    • 直接回答:先完成词项召回,还要读取词位并验证顺序、相邻或允许间隔。
    • 详情:查询语义
  9. 问题:prefix(前缀)、wildcard(通配符)、fuzzy(模糊)和 ngram(多元切分)如何选型?

    • 口述答案:这四种能力都能扩大容错,但成本位置不同。prefix(前缀)利用固定开头枚举词典连续范围,适合长度足够的运单号或 SKU(库存单位)补全;前缀太短仍会覆盖大量词项。wildcard(通配符)允许任意模式,尤其前导通配缺少可利用的固定开头,可能扫描大量词项并合并许多倒排表,应默认禁止或放到有界异步查询。fuzzy(模糊)按编辑距离扩展相近词项,对英文拼写错误有价值,但短中文和数字标识信息量低,改一位可能命中大量真实运单,既慢又有展示错误实体的风险。ngram(多元切分)在写入时预建子串,查询较快,却让每篇文档产生更多词项、磁盘和 merge(合并)成本,二元短串还会把“机”类查询扩成海量噪声。工程顺序是先字符规范和精确命中,再尝试受控前缀,然后只在专用字段、最短输入和候选上限内开放模糊或多元切分。运单号先校验渠道前缀、长度、连接符和校验位,精确失败后才能在同租户硬过滤内给编辑距离一的候选,并明确提示“相似号码”;最终轨迹回源确认。所有高成本路有独立超时、并发配额和降级,超时回到精确与全文,不能返回未过滤候选。评测同时看召回、误匹配、候选数、处理器时间和高分位,不能以单次能返回为上线依据。安全回归还要确认跨租户候选为零、相似运单只显示脱敏提示、超时不会回退为无过滤查询;容量测试按输入长度和扩展词数分桶,超过预算时在入口拒绝而非拖到集群超时。
    • 追问:为什么前导通配比后缀通配更危险?
    • 直接回答:后缀通配可利用固定前缀定位词典区间,前导通配通常要检查更大范围的词项。
    • 追问:数字运单号适合模糊查询吗?
    • 直接回答:只适合强约束后的辅助提示,不能把相似号码直接当目标运单或业务事实。
    • 追问:多元切分为何要专用字段?
    • 直接回答:它的词项数量和短串碰撞高,隔离字段便于独立权重、查询门控、容量控制和下线。
    • 详情:模糊能力
  10. 问题:请逐步复算三篇文档的 BM25(最佳匹配 25)排序。

  • 口述答案:我使用文中可复算样例,不把生产实现隐藏在“相关性更高”一句话里。D1 为“无线 鼠标 鼠标 静音”,长度 4;D2 为“无线 鼠标 办公 便携 充电”,长度 5;D3 为“鼠标 垫 红色”,长度 3,平均长度是 4。查询“无线 鼠标”,文档总数 N=3;“无线”出现在两篇,df=2,按 ln(1+(N-df+0.5)/(df+0.5))IDF=0.4700;“鼠标”出现在三篇,df=3,得 IDF=0.1335。取 k1=1.2,b=0.75。D1 长度等于平均值,“无线”词频一的饱和项为 1,“鼠标”词频二的饱和项为 1.375,所以总分约 0.4700+0.1335*1.375=0.6536。D2 较长,长度项为 1.425,两个词频都为一,饱和项各约 0.9072,总分约 0.5476。D3 只含“鼠标”,长度较短,饱和项约 1.1139,总分约 0.1487,故排序 D1、D2、D3。这个结果体现三点:稀有的“无线”区分力高于遍布全集的“鼠标”;D1 的重复词提高得分但收益饱和;D2 较长受到长度归一化。现场解释可能还受字段 boost(权重)、分片统计、复合查询和 function score(函数评分)影响,参数与 norm(归一化因子)编码标记待现场核对。高分只表示文本更匹配,不证明库存、权限或轨迹正确。生产核对时固定同一索引快照与查询,抽取实际词项统计、字段长度、相似度参数和复合权重逐项对账;再修改一个输入观察分数方向,确认解释数字没有被错误字段或后置函数主导。分数回归还要覆盖词频为零、一、二和高频饱和,字段长度从短标题到长描述分桶,并确认同一硬过滤集合下排序稳定;计算误差、字段误用或统计漂移任一未解释都不进入发布。
  • 追问:词频重复二十次会增长二十倍吗?
  • 直接回答:不会,词频项逐渐饱和,堆词不能无限线性抬分。
  • 追问:长字段一定低分吗?
  • 直接回答:不是,长度只是一个归一化因素,稀有词、词频、字段权重和其他信号仍共同决定得分。
  • 追问:教学公式能否逐位复现生产?
  • 直接回答:不能直接承诺,要核对现场版本、参数、统计范围、重叠词、分片和复合评分,再用解释接口抽样。
  • 详情:三文档计算
  1. 问题:boost(权重)、function score(函数评分)和业务重排应怎样使用?
  • 口述答案:我先把三类信号放在不同层次。BM25(最佳匹配 25)回答文本词项与文档字段的匹配程度;boost(权重)调整字段或子句的相对重要性,例如运单号完整命中高于渠道别名,商品标题高于长描述;function score(函数评分)叠加可数值化的业务信号,例如时间衰减、服务等级、销量或库存展示状态;更复杂的跨候选特征放在有限候选的业务重排。权重不是越大越好,若运单号前缀获得与完整命中相同权重,相似号可能压过目标号;销量直接线性相乘会让头部商品永久占据首位;时间衰减没有下限会让旧但准确的物流轨迹消失。稳定信号优先在写入或异步任务中预计算为数值字段,查询时做饱和、封顶或分段函数,避免对数万候选逐篇执行脚本。库存、权限和可用性若属于硬业务约束,应进入过滤而不是靠低分隐藏;最终库存仍回 WMS(仓储管理系统)确认。调参流程以查询意图分桶:精确单号看 MRR(平均倒数排名),商品列表看 NDCG(归一化折损累计增益)和转化,报警搜索还要看严重级别不被降权。上线前保存旧策略基线、解释样本和候选规模,影子回放后小流量 A/B Test(对照实验);任何越权、零库存错误展示、延迟或投诉守护退化都停止扩流。相关性分数是排序工具,不是业务正确性的概率。每个新增业务信号都做消融实验:保持候选不变,分别关闭该信号比较名次、转化、长尾曝光和延迟;若收益只来自少数热门词或损害关键查询,就按意图限定,而不是扩大为全局权重。
  • 追问:库存应当加分还是过滤?
  • 直接回答:不可售若禁止展示就硬过滤;允许展示缺货商品时可明确降权,但下单仍回权威库存校验。
  • 追问:为什么销量不宜线性放大?
  • 直接回答:头部值跨度大,会淹没文本相关性并造成马太效应,应做对数、饱和或封顶并设探索空间。
  • 追问:时间衰减使用哪个时间?
  • 直接回答:使用与业务目标一致且可信的事件时间,不能把索引写入时间误当轨迹发生时间。
  • 详情:召回与重排信号
  1. 问题:混合检索中 BM25(最佳匹配 25)和向量召回的边界是什么?
  • 口述答案:文本倒排和 vector retrieval(向量召回)解决的是互补问题。BM25(最佳匹配 25)对显式词项、稀有专名、运单号片段、渠道名和可解释匹配很强,能通过词项、词频和字段长度说明原因;向量召回适合“包裹一直没动”“物流长时间无更新”这类表达不同但语义接近的查询,也能找相似报警描述。向量不适合承担完整运单号、租户权限、库存可售、报警状态等精确或硬约束,也不能因为语义距离近就认定两条事件是同一事实。工程链先做意图识别:标识符走精确路,自然语言并行走全文和有限向量候选;每路设置候选上限与超时,返回后按稳定文档键去重。不同召回路的原始分数尺度不一致,不能直接相加,应采用名次融合、校准分数或在标注集上训练的重排;模型版本、向量生成和缺失向量都要可观测。重排只处理压缩候选,若对全库向量和脚本精排,尾延迟与处理器成本会失控。向量路超时应降级到精确和全文,不能跳过权限过滤。离线分别看词面查询、语义改写、专名和反例的 Recall(召回率)、NDCG(归一化折损累计增益),在线观察转化、零结果、延迟和投诉。数据库与事件日志仍是权威源,向量只是搜索投影的一种索引结构,可以随模型升级重建。模型发布还要保存向量维度、编码器版本、语料时间和相似度分布,双写新旧向量后比较候选交集;缺失或异常向量只关闭语义路,不得影响精确查询和权限校验。
  • 追问:两路分数为什么不能直接相加?
  • 直接回答:它们的范围、分布和含义不同,未经校准的数值相加会让某一路因尺度占优。
  • 追问:向量召回超时如何降级?
  • 直接回答:保留精确和全文结果,标记召回代际并继续执行权限与可用性硬过滤。
  • 追问:向量能否找运单号错一位?
  • 直接回答:不应作为主方案,标识符容错应使用规范化、校验规则和受控编辑距离。
  • 详情:混合检索链
  1. 问题:多路召回、候选集和重排成本如何量化?
  • 口述答案:我把每一阶段都写成“输入规模、压缩比例、单项成本和超时”。假设 8 个分片各有 100 万篇文档,目标返回 20 条;精确路每片最多 20,全文路每片 100,向量路每片 50,分片先做局部 Top-K(最高 K 个结果),协调端最多接收 1360 条,按业务键去重后可能剩 900 条,再只对前 200 条执行复杂重排,最后批量做权限和库存校验。这样比对 800 万篇执行脚本可控得多。分治提速的前提是局部候选能压缩,并且局部排序与全局目标足够一致;若后置业务信号很强,局部文本第 500 名可能在全局跃升第一,局部只取 100 就会永久漏掉。解决办法不是无限扩大,而是分析名次跃迁分布,把稳定业务信号前移到分片初排、建立得分上界,或按意图提高候选深度。协调端还要预算网络字节、去重映射、分数归一化和堆内存;每路独立超时和熔断,昂贵路失败时保留基础召回。回归用标注集绘制候选深度从 50、100、200、500 增加时 Recall(召回率)与高分位曲线,找到质量收益趋缓点;峰值压测还要模拟热点查询和单分片慢。权限过滤必须在结果可见前执行,不能因批量服务超时返回未过滤候选。这个量化过程比“多召回几路更准”更能回答容量和失败边界。上线监控会逐路记录请求占比、召回量、独有相关文档、超时和最终入选率;长期只产噪声却消耗大量资源的召回路应降权或下线,候选预算则随真实分布重新标定。
  • 追问:候选深度越大越安全吗?
  • 直接回答:质量漏失风险降低,但网络、协调堆、去重和重排成本增加,需要在真实曲线上找拐点。
  • 追问:为何把稳定信号前移?
  • 直接回答:可减少局部截断与最终目标不一致,让真正可能跃升的文档保留到全局阶段。
  • 追问:权限服务超时怎么办?
  • 直接回答:默认拒绝或使用版本明确的安全缓存,不能绕过过滤返回候选。
  • 详情:候选压缩
  1. 问题:分片局部 Top-K(最高 K 个结果)归并的正确性边界是什么?
  • 口述答案:协调查询通常让每个分片先匹配并排序局部候选,再把有限结果发给协调端做全局归并,这用分治减少网络和协调计算。但“每片取 K 条即可得到全局 K 条”只在局部排序分数与全局排序定义一致、统计可比较且没有强后置重排时成立。文本相关性可能受分片文档频率近似、不同数据分布和字段统计影响;更关键的是全局阶段若再加入销量、时间、租户等级或向量分数,局部被截掉的文档无法复活。举例每片只取 20,某商品文本排第 25,但库存充足且业务等级极高,最终本应进全局前十,却已被丢弃。工程上先通过离线全量或较深候选作为近似真值,测不同局部深度的全局 Recall(召回率);对能预计算的业务信号在分片阶段使用同一公式,对不能前移的信号预留更深候选或建立上界剪枝。去重也会改变需求:多个分片或多路召回返回同一业务实体,归并后不足 K 条,需要超额取候选。深分页不能不断增大每片偏移,应用稳定排序与游标式分页,导出走异步。热点分片慢时,协调端不能用其他分片结果冒充完整答案,需按产品语义标记部分失败或降级。验证同时覆盖均匀与倾斜分布、相关性跃迁、重复实体、分片超时和权限过滤,确保提速没有静默漏召回。我还会用较深候选离线计算被局部截断却本应全局入选的比例,按分片和意图定位最坏案例;当数据倾斜或业务权重变化使该比例越线时,阻止发布并重新调整候选深度或前移信号。这项检查在每次重排信号变更后重新执行。
  • 追问:局部文本分数为何可能不可直接比较?
  • 直接回答:词项统计和数据分布可能按分片近似,现场具体统计方式需核对并用解释样本验证。
  • 追问:去重为何要求超额候选?
  • 直接回答:多个候选可能映射到同一业务实体,去重后数量减少,不超额就可能凑不满全局 K 条。
  • 追问:分片超时能否返回其他分片结果?
  • 直接回答:只能按明确的部分结果或降级契约返回,不能伪装成完整搜索并用于业务裁决。
  • 详情:局部归并边界
  1. 问题:搜索去重为什么不能只按展示标题?
  • 口述答案:去重要基于稳定业务实体键和版本语义,展示标题既不唯一也会变化。多路召回可能同时从运单号精确、商品全文、拼音、同义词和向量路返回同一文档;索引重建或事件乱序还可能让同一业务键短暂存在不同版本。若按标题去重,两个不同 SKU(库存单位)恰好同名会被错误合并,同一商品改名又无法合并;若按内部随机文档标识,多代索引或重试产生的副本也会重复展示。正确做法是在投影中保存租户、业务键、来源版本、删除标记和事件水位,多路候选先按 租户+业务键 聚合,优先选择版本更高且未删除的索引文档,再合并命中原因与最高可信分数。跨境物流一票多包裹时还要先定义去重层级:用户搜运单可能要展示主单一条并展开包裹,也可能按包裹逐条展示,不能由通用算法猜测。去重发生在权限硬过滤之后或与其共同保证,绝不能用“最终会去重”解释未授权候选进入处理链。搜索索引版本与权威数据库冲突时,展示可标注索引水位并回源,不能仅凭较高搜索分数选“最新”。回归覆盖同名不同商品、改名同商品、多语言标题、一票多件、旧版本删除和双索引并行;指标除重复率外,还要看误合并率和结果完整性。权威实体关系来自数据库或事件日志,搜索层只按明确规则折叠展示。双索引灰度期间还要把索引代际纳入去重,比较新旧文档版本和删除状态;若版本无法判定,就保留旧读路径并回源,而不是随机选一个得分更高的副本展示。去重规则也必须接受业务所有者审查。
  • 追问:同一业务键两个版本都存在时选谁?
  • 直接回答:按权威来源版本和删除语义选择,搜索分数不能决定哪个版本更新。
  • 追问:去重应在权限过滤前还是后?
  • 直接回答:必须保证未授权文档不会影响可见结果、计数和命中原因,通常先硬过滤再按可见实体去重。
  • 追问:重复率下降就是去重成功吗?
  • 直接回答:不是,还要检查同名不同实体是否被误合并,以及主单与包裹等业务层级是否完整。
  • 详情:召回后去重
  1. 问题:如何建立搜索质量标注集并避免样本偏差?
  • 口述答案:标注集不是随便挑几十个热门词,而要覆盖真实查询分布、关键业务和已知失败。样本至少按意图分层:完整运单号、部分运单号、中文商品名、SKU(库存单位)、渠道别名、拼音、IoT(物联网)报警描述、长自然语言、短词、零结果和权限场景;再按租户、地区、设备、流量头尾和时间分桶。每条样本保存原始查询、上下文、可见数据域、候选文档、相关等级、不可见原因和标注时间。商品列表可用 0 到 3 的多级相关,运单号更接近唯一正确答案;权限文档即使文本相关也标为不可返回,不能混入普通低相关。至少两名标注者独立判断,冲突由业务规则仲裁并记录准则,定期抽查一致性。只从历史点击构造会继承旧排序的位置偏差和曝光盲区,未展示文档不等于不相关;需要加入随机探索、人工检索和事故语料。标注集分为稳定回归集、近期漂移集和安全红线集,训练或调参不能同时消费最终评测答案。每次词典、分析器、模型或权重发布都在同一基线上比较 Precision(准确率)、Recall(召回率)、MRR(平均倒数排名)和 NDCG(归一化折损累计增益),并报告意图分桶而非只看平均。数据库和事件日志提供当时权威状态快照,防止后来库存、权限或删除变化污染判断;标注版本与索引代际一起归档,结果才能复现。标注过程还会保存冲突原因和仲裁规则,按月抽取新词、低频租户与事故查询补充漂移集;当业务目录、渠道或报警规则变化时重标受影响样本,不能拿过期标签评价新语义。
  • 追问:为什么热门查询不能代表全部质量?
  • 直接回答:它们忽略长尾、新词、短词、租户差异和安全边界,平均提升可能掩盖关键场景退化。
  • 追问:点击日志可否直接当相关标签?
  • 直接回答:不能,点击受位置、曝光、文案、价格和库存影响,需要偏差校正与人工标注补充。
  • 追问:权限文档文本很相关如何标?
  • 直接回答:对当前用户应标为不可返回,授权是硬边界,不属于普通相关等级。
  • 详情:质量评测
  1. 问题:Precision(准确率)、Recall(召回率)、MRR(平均倒数排名)和 NDCG(归一化折损累计增益)分别解决什么问题?
  • 口述答案:四个指标观察不同层面。Precision(准确率)是返回结果中相关文档比例,回答噪声多不多;Recall(召回率)是全部相关文档中被找回的比例,回答有没有漏;二者是集合指标,不关心具体位置。MRR(平均倒数排名)对每个查询取第一个相关结果名次的倒数再平均,第一名得 1、第二名得 0.5,适合用户要找唯一运单或唯一 SKU(库存单位)的场景,但忽略第一个相关结果之后的列表质量。NDCG(归一化折损累计增益)允许多级相关,把高相关结果放在前面获得更大收益,位置越后折损越大,再除以理想排序,适合商品、渠道和报警列表。举例两个查询,第一个相关结果分别在第二和第一位,MRR(平均倒数排名)为 (0.5+1)/2=0.75;若前五等级是 [0,3,1,2,0],NDCG(归一化折损累计增益)会惩罚最高相关文档没有排第一。零结果率补充覆盖,点击率和转化率补充线上行为,但不能替代离线相关性:点击有位置偏差,转化还受库存、价格和活动影响。发布决策应按意图选择主指标,并同时设置权限泄漏为 0、延迟、错误率、投诉和资源守护。若同义词让召回率上升、准确率下降,要判断业务是否接受;若总体 NDCG(归一化折损累计增益)上升却运单 MRR(平均倒数排名)下降,精确查询红线仍要求回滚。实际报告会给出分子、分母、截断位置、置信区间和意图分桶,不只给一个平均百分数;当集合指标与位置指标冲突时,回到用户任务判断失败成本,并保留安全与延迟红线。
  • 追问:哪个指标最重要?
  • 直接回答:没有脱离业务的唯一指标,唯一答案看首位,列表看等级排序,扩召还要看集合覆盖和噪声。
  • 追问:零结果率越低越好吗?
  • 直接回答:不是,返回无关结果也能把它降到零,必须与准确率、投诉和转化一起看。
  • 追问:NDCG(归一化折损累计增益)依赖什么?
  • 直接回答:依赖一致的多级相关标注和位置折损定义,标注漂移会让跨版本比较失真。
  • 详情:指标矩阵
  1. 问题:在线 A/B Test(对照实验)如何处理位置偏差和反事实问题?
  • 口述答案:在线实验先保证随机分流单位与业务一致,例如按用户或租户稳定分桶,避免同一会话在新旧策略间跳变;记录曝光、位置、查询意图、候选、点击、转化、库存、权限版本和延迟。位置越靠前天然越容易点击,所以点击率上升可能只是新策略把更吸引眼球的结果放前面,并不代表相关性或转化提高。分析时分位置、意图和租户比较,必要时设置小比例随机探索或交换位置来估计曝光倾向,但安全、权限和关键运单查询不能参与有风险探索。反事实评估希望用历史日志估计“未上线策略会怎样”,可通过倾向得分等方法校正已展示策略的选择偏差;但历史从未曝光的文档缺少可靠反馈,倾向模型错误也会放大方差,所以只能作为上线前筛选,不能替代受控实验。实验开始前定义主目标和守护指标:商品搜索可看转化,运单搜索看首位成功,守护包括越权为 0、零结果、高分位、错误率、投诉和资源。样本量与观察周期覆盖工作日、活动和长尾,不在中途反复窥视后挑最好时点停止。若点击升 5% 而转化降 3%,先停止扩流,拆解是否标题、价格或库存造成无效点击;若平均提升却大租户退化,也不能用总体值掩盖。最终把实验版本、词典、索引代际和分析代码归档,确保结论可复现。实验复盘还会检查样本比例失衡、机器人流量、跨组污染和节假日效应,并预先登记停止规则;所有二次切片都标明探索性质,防止从大量切片中挑出偶然显著结果。实验异常时优先保护守护指标并回滚。
  • 追问:为何按请求随机可能串组?
  • 直接回答:同一用户连续请求可能看到不同策略并互相影响,稳定用户或租户分桶更能保持实验独立性。
  • 追问:反事实评估能替代线上实验吗?
  • 直接回答:不能,它依赖历史曝光和倾向模型,对未展示候选与策略漂移存在不可消除的不确定性。
  • 追问:安全指标能否等待显著性?
  • 直接回答:不能,越权等红线一旦出现立即停止,不以业务提升或统计等待抵扣。
  • 详情:离线与在线评测
  1. 问题:词典或分析器更新为什么常用双索引重建?
  • 口述答案:分析器决定词项、词位、偏移和归一化结构,一旦文档写入不可变 segment(分段),旧分析结果不会因配置变化自动重算。若直接在原索引改规则,之后写入的新文档使用新语义,旧文档仍用旧语义,同一查询可能按文档年龄得到不同结果;索引端同义词尤其如此。因此我把映射、分析器、词典和插件校验值冻结为新代际,创建新索引,从数据库一致快照或可回放事件做全量导入,记录起始事件水位;全量期间继续消费增量和删除,按业务键与版本幂等应用。追平后先做结构校验:总数、租户聚合、业务版本、删除、权限字段和失败样本;再用影子查询把同一请求、同一用户权限同时打到新旧索引,比较前十集合、排名、零结果、解释、高分位和资源。通过后读别名只切小比例流量,逐级扩大;词典节点不一致、精确运单 MRR(平均倒数排名)下降、权限差异或延迟越线时立即切回旧索引。旧索引在观察窗口只读保留,事件日志和新索引水位继续存在,便于修复后重试。不能因文档数相同就切流,因为错误分析、漏删和越权不会被总数发现;也不能从旧索引复制到新索引,因为那会保留旧词项。数据库与事件日志始终是权威源,双索引只是把重建变成可校验、可回滚的读路径变更。重建过程必须可中断续跑,每个分区保存输入范围、权威版本、成功摘要和失败样本;切换演练会主动注入词典加载失败、增量积压与别名回滚,证明旧读路径在压力下仍可恢复。
  • 追问:全量完成为什么不能立即切换?
  • 直接回答:全量期间源端仍变化,必须追平增量、删除和权限,并完成行为与性能比较。
  • 追问:文档数相同是否足够?
  • 直接回答:不够,还要校验版本、删除、字段、权限、查询集合、排序和事件水位。
  • 追问:旧索引何时删除?
  • 直接回答:新代际经过高峰、故障和业务观察窗口,回滚责任解除且恢复验证通过后再受控删除。
  • 详情:双索引发布
  1. 问题:影子查询应该比较哪些差异,怎样避免影响生产?
  • 口述答案:影子查询不是只比前十文档编号,而是对同一原始请求保存查询意图、用户与租户权限、索引和词典代际,把主流量结果正常返回用户,同时异步复制到新索引。比较分四层:第一层是分析输出,包括规范文本、词元、词位和同义词;第二层是候选集合,包括零结果、召回路、前十交集和新增丢失文档;第三层是排序与解释,包括名次跃迁、BM25(最佳匹配 25)、boost(权重)、函数信号和去重;第四层是安全与性能,包括权限差异必须为 0、库存展示、超时、处理器、堆、每分片候选和高分位。差异需要分类,预期同义词扩召不能和异常漏召回混在一个百分比里。为了不影响生产,影子请求不占用用户超时预算,设置独立采样、并发、线程池和熔断;新索引慢或失败时立即丢弃影子结果,不能拖慢主链。涉及脚本、向量和大查询的样本按配额执行,敏感字段遵循同样脱敏与审计。比较器保存可复现请求但不记录无界原文,权限上下文必须完整,否则“结果不同”没有意义。通过标准按意图分桶,例如总体 NDCG(归一化折损累计增益)提升不能抵扣精确运单 MRR(平均倒数排名)退化;权限差异、严重报警漏召回和高分位越线属于硬失败。影子阶段没有真实用户行为,所以之后仍需小流量 A/B Test(对照实验)验证点击和转化。差异样本要可按请求标识回放,并区分预期新增、预期删除、未知变化和安全错误;比较任务本身若积压或丢样也要告警,不能用不完整影子数据批准发布。
  • 追问:影子请求需要携带权限吗?
  • 直接回答:必须携带同一授权上下文,否则集合差异无法判断,甚至会掩盖越权风险。
  • 追问:影子结果更好能否直接全量?
  • 直接回答:不能,影子缺少真实行为反馈,还需灰度验证业务目标、守护指标和资源峰值。
  • 追问:如何防止影子压垮集群?
  • 直接回答:独立采样、配额、线程池、超时和熔断,资源越线先丢影子,不影响主链。
  • 详情:影子与灰度
  1. 问题:线上突然大量零结果,如何建立证据链并恢复?
  • 口述答案:我先按查询意图和时间定界,不会直接把 minimum_should_match(最小匹配数)调为 1。确认零结果是完整运单号、商品名、渠道名还是报警文本,是否集中在新词、特定租户、节点或索引切换后。第一类搜索证据保存原始输入、规范化结果、index analyzer(索引分析器)与 search analyzer(搜索分析器)的逐阶段词元、目标字段、布尔树、词典摘要、索引代际、查询解释和事件水位;第二类业务证据核对数据库或事件日志中权威文档是否存在、版本、删除、租户权限和同步消费状态。若权威文档存在而索引水位落后,是投影同步问题;若索引有文档却查询词项不存在,是分析不兼容;若权限过滤后为空,可能是真实无权而非搜索故障。止血按能力分级:完整运单号与 SKU(库存单位)可在限流、同租户条件下回源,全文商品和报警搜索不能由数据库无界扫描,应该明确降级并保留查询;关闭刚发布的词典或切回旧别名,而不是无限扩召。修复同步时从稳定事件断点按业务版本回放,修复分析时新建索引重分析并追增量。回归使用事故语料、同形反例、真实无结果、删除和越权样本,比较零结果率、Precision(准确率)、Recall(召回率)、高分位和资源;最终用权威版本与事件水位签收。若只让事故查询有结果却产生大量误匹配,仍不算恢复。事故关闭前还要复核过去一段时间的历史查询和未索引事件,确认没有静默漏数;监控按意图展示零结果而非只看总平均,并为词典、消费水位和别名代际建立关联告警。
  • 追问:为什么不先放宽所有查询门槛?
  • 直接回答:会把分析或同步故障掩盖成大量噪声,还可能放大候选和资源事故。
  • 追问:哪些查询适合回源?
  • 直接回答:有稳定精确键且可用索引定位的单条查询可限流回源,全文和模糊查询通常不适合主库扫描。
  • 追问:怎样区分真实零结果?
  • 直接回答:权威源无文档、已删除或当前用户无权时是真实空集,并由业务规则和权限证据确认。
  • 详情:零结果排障
  1. 问题:错误匹配突然增多,怎样区分分词、同义词和查询语义问题?
  • 口述答案:错误匹配要从“为什么这篇进入候选”反推。第一类搜索证据对事故查询执行逐阶段分析和命中解释,记录命中的字段、词项、position(词位)、同义词路径、模糊扩展、minimum_should_match(最小匹配数)、每路候选数与最终得分;第二类业务证据是用户意图、标注等级、投诉样本、权威实体类型和同期非事故反例。若“苹果手机壳”因二元切分命中“工业机壳”,是短词与字段噪声;若“外壳”同义词双向展开到机器外壳,是词典边界;若五词查询门槛只有 1,是布尔语义过宽;若商品标题低分却靠销量脚本升首位,是重排淹没文本。止血优先关闭最近发布的高噪声同义词、模糊路或脚本,切回旧词典或旧别名,并保留精确与基础全文;不要删除权威文档,也不要把所有查询改成短语。长期修复为同义词增加方向、字段和业务域,限制短词、前导通配和编辑距离,按查询长度设置门槛,给业务信号做饱和封顶。回归至少包含事故正例、同词不同义反例、短词、品牌、渠道、租户和零结果,比较 Precision(准确率)、Recall(召回率)、MRR(平均倒数排名)、候选数和延迟。在线灰度还看点击后的快速返回、投诉与转化,防止离线看似相关却不满足业务意图。最终复盘会把每类误匹配归属到规则、字段、查询或重排责任人,保留修复前后解释样本;若相同词在不同业务域含义冲突,就隔离字段或索引,而不是继续叠加全局例外。
  • 追问:解释接口显示命中哪个词就够了吗?
  • 直接回答:不够,还要追溯该词由哪个字段、分析步骤、同义规则或模糊扩展生成,以及重排如何改变名次。
  • 追问:关闭同义词是否会伤召回?
  • 直接回答:可能,所以止血只回滚问题规则或代际,随后用正反标注集重新评估准确率与召回率。
  • 追问:销量高的商品错排算搜索问题吗?
  • 直接回答:若业务重排压过明显文本意图就是搜索策略问题,销量不能替代相关性与硬过滤。
  • 详情:错误匹配矩阵
  1. 问题:过滤缓存命中率很高却发生权限泄漏,如何处置?
  • 口述答案:越权是安全事故,不能因缓存命中率 95% 或相关性正常而降级处理。第一步立即停止相关入口或切到默认拒绝路径,失效可疑缓存,保留访问、授权和查询审计;不能回退为无权限过滤,也不能只在返回页面隐藏。第一类搜索证据检查过滤查询、缓存键、租户、用户、角色、数据域、权限版本、索引代际、分段和命中位集,确认未授权文档是否进入候选、聚合、计数或高亮;第二类业务证据从权限服务和数据库读取当时授权决策、变更时间、操作者和受影响租户,再结合网关访问日志确定暴露范围。典型根因是缓存键遗漏租户或权限版本,租户乙的旧位集被租户甲复用;也可能授权撤销未触发失效,或权限被错误放在 should。修复要求权限条件成为不可绕过的 keyword(精确字段)硬过滤,缓存键包含租户、数据域、授权版本、查询语义和索引代际,授权变化产生单调版本并主动失效;缓存不可用时默认拒绝或使用版本明确的安全快照。回归构造跨租户、角色升降、仓库转移、缓存冷热、分段变化和并发授权变更,要求越权为 0,同时检查聚合计数和日志侧信道。恢复后按审计记录通知与复盘,相关性、性能提升均不能抵扣一次权限泄漏。还要根据审计日志评估暴露文档、字段、用户和时间窗口,必要时执行合规通知与密钥处置;恢复流量采用逐租户验证,缓存命中率只能作为性能指标,不能作为安全签收依据。安全回归报告由权限责任人与搜索责任人共同签收。
  • 追问:为什么返回前再过滤仍可能不安全?
  • 直接回答:未授权文档可能已影响聚合、总数、高亮、日志、缓存或重排,形成可观测侧信道。
  • 追问:缓存失效后能否临时放行?
  • 直接回答:不能,权限路径应默认拒绝或回到可验证授权服务,性能问题不能改变授权语义。
  • 追问:权限回归只测最终列表吗?
  • 直接回答:不够,还要测总数、聚合、高亮、导出、日志和跨租户缓存复用。
  • 详情:权限与缓存
  1. 问题:脚本评分导致查询超时,怎样止血和长期优化?
  • 口述答案:我先把总延迟拆成召回候选数、脚本每次成本、执行次数和并发。假设某查询先召回 5 万篇,脚本每篇只耗 0.08 毫秒,单请求理论处理器时间也约 4 秒;脚本看起来短,乘以候选和峰值并发后仍会拖垮线程池。第一类搜索证据看慢查询、查询阶段、候选数、脚本调用次数、字段访问、缓存和重排前后耗时;第二类资源证据看处理器、运行队列、线程池拒绝、堆、垃圾回收、高分位和热点查询指纹。止血是关闭脚本或切回旧排序,只保留精确与 BM25(最佳匹配 25)初排;对高风险入口限流,向量和模糊路可熔断,但权限与可用性过滤继续执行。不能简单提高超时,因为会让更多昂贵请求占住资源,也不能只加节点掩盖每篇候选计算。长期把销量、服务等级、时间衰减等稳定信号在写入或异步链预计算为数值字段,使用内建饱和、封顶和衰减函数;先将候选压到例如 300 条,再执行必要重排,并为脚本设置最大候选、超时和降级。若信号依赖外部服务,批量获取且不在每篇脚本内远程调用。回归覆盖候选 50、300、5000 和 5 万的阶梯,峰值并发、热点、冷缓存和单分片慢,同时比较 NDCG(归一化折损累计增益)收益;质量增益不足以覆盖延迟和资源成本时不恢复脚本。优化后以相同查询和候选快照做前后消融,证明质量损失在门槛内;同时设置脚本调用数与候选数乘积告警,发布新规则若让该乘积异常增长,自动回退基础排序。
  • 追问:把超时从一秒调到五秒可行吗?
  • 直接回答:只能作为极短期隔离实验,长期会占住更多线程和处理器,扩大排队与级联超时。
  • 追问:预计算会不会变旧?
  • 直接回答:会,所以要定义更新时间和业务容忍窗口;稳定近似信号通常比查询期逐篇昂贵计算更可控。
  • 追问:脚本关闭后如何保证基本体验?
  • 直接回答:保留精确、全文初排和硬过滤,明确降级代际,优先保证正确、安全和可用。
  • 详情:脚本评分排障
  1. 问题:字段爆炸、高基数过滤和深分页同时出现时如何治理?
  • 口述答案:这三类问题可能共同放大协调和内存压力,但根因不同,必须分别取证。字段爆炸的第一类证据是字段总数、映射变更频率、集群状态大小、写入拒绝和异常字段样本,业务证据是哪个租户把任意属性键当字段;高基数过滤看过滤选择率、位集构造、分段、频率和候选,业务侧看租户、用户或设备分布;深分页看页深、每分片保留候选、排序字段、协调堆和网络,业务侧确认用户是在浏览还是导出。止血先拒绝未知动态字段并隔离异常租户,限制一次性高基数组合,禁止超过门槛的偏移分页;普通列表改稳定排序的游标式分页,大导出转异步任务。不能删除磁盘中的分段文件,也不能把权限过滤因高基数而移除。长期把任意属性改成受控键值结构或白名单,常用过滤字段保持 keyword(精确字段)与明确类型;按租户路由或冷热隔离要基于数据倾斜验证,过滤缓存键包含代际且只缓存有复用价值的查询。分页使用稳定唯一排序键和时间点视图,处理更新、重复与遗漏,异步导出保存断点。回归同时覆盖冷、热缓存,不同租户基数、分段合并、第一页到末页、授权变化和节点压力;指标看字段数增长、映射延迟、过滤处理器时间、协调堆、高分位和结果完整性。三者都缓解且权限不变,才算恢复。容量回归还要在字段重建、分段合并和深分页并发重叠时执行,观察磁盘、协调堆和拒绝;结果页使用稳定唯一排序键,数据变化导致的重复或遗漏要有明确会话语义。
  • 追问:高基数过滤为何不一定适合缓存?
  • 直接回答:组合值可能几乎不重复,构造和保存位集的成本高于复用收益,还会占用内存。
  • 追问:深分页为什么影响每个分片?
  • 直接回答:每个分片都可能保留到偏移加页大小的候选,协调端再归并,成本随页深放大。
  • 追问:动态字段关闭后旧字段会消失吗?
  • 直接回答:不会自动回收,通常要用收敛后的映射重建新索引并切换。
  • 详情:生产故障矩阵
  1. 问题:热点查询和相关性回归同时发生,如何判断先后关系?
  • 口述答案:我先建立统一时间线,把词典、分析器、权重或模型发布点与查询指纹频率、候选数、高分位、处理器和投诉对齐。相关性发布可能把一个热门短词从 500 个候选扩成 8 万,先造成资源热点,再因超时或部分分片失败表现为排序回归;也可能业务活动先让某查询暴增,缓存和线程池压力改变尾延迟,但排序策略本身没有变化。第一类搜索证据比较新旧代际的逐阶段词元、召回路、每路候选、前十差异、得分解释和分片耗时;第二类业务与资源证据看流量来源、活动、租户、处理器、堆、磁盘、拒绝、点击和投诉。止血按可逆性执行:若发布后候选暴涨,切回旧词典或旧别名并熔断昂贵路;若纯流量热点,按租户和查询指纹限流、请求合并或短期安全缓存,保护精确单号与权限查询。不能用提高缓存命中掩盖错误结果,也不能因排序回归移除硬过滤。长期对热门查询设置候选预算和词典扩展上限,预计算稳定结果时带索引与权限版本,建立按意图的质量和容量双基线。回归在相同查询分布下比较新旧排序,同时模拟冷缓存、节点慢和峰值;只有前十质量、延迟、拒绝、资源和安全守护全部达标才逐步恢复。因果判断依靠发布前后和旧策略对照,不凭单一相关系数下结论。时间线结论还会用旧策略承接同一份流量做对照,并对热门与长尾分别报告;若资源恢复后相关性仍退化,说明不是单纯热点,继续沿分析、候选和重排逐层定位。任何无法由对照解释的变化都保留为未决风险,不进入扩流。
  • 追问:热点缓存可以不带权限版本吗?
  • 直接回答:不能,缓存结果必须与租户、授权和索引代际绑定,否则性能优化会变成越权风险。
  • 追问:候选暴涨为何会改变排序?
  • 直接回答:更多噪声参与竞争、重排和超时,局部截断与部分失败也可能让前列集合漂移。
  • 追问:如何证明是发布引起?
  • 直接回答:用同请求在旧代际影子回放,对齐发布时间、分析输出、候选和资源差异,并排除同期流量变化。
  • 详情:热点与回归
  1. 问题:索引重建失败时如何保护旧服务并继续追平?
  • 口述答案:重建失败首先禁止切流和删除旧索引,保护仍可服务的读别名、权威快照、事件日志和已完成分区断点。第一类重建证据包括新索引映射与词典代际、全量分区进度、成功数、失败样本、业务版本、删除、增量消费水位和影子差异;第二类资源与源端证据包括数据库快照一致性、事件保留窗口、磁盘峰值、merge(合并)、网络、线程池和限流。若某分区因脏数据失败,不能跳过后把总数接近当成功;把失败记录隔离并保留业务键、原始版本和错误原因,修复映射或转换后从稳定断点幂等重试。若目标持续写入速率低于源端新增速率,增量永远追不平,应暂停低优先级回填、扩充受控资源或重算窗口,而不是在水位落后时切换。若磁盘不足,保留旧索引和恢复点优先,降低新索引副本或合并策略必须经过风险评审,不能手工删段。恢复后校验文档数只是第一层,还要按租户和日期聚合、业务版本、删除、权限字段、关键查询、前十排序、高分位和事件水位。影子通过后再小流量切别名,旧索引在回滚窗口只读保留。若事件日志已过保留期且无法取得一致权威快照,应停止迁移并补齐恢复来源,不能从旧错误索引复制分析结果。重建完成的定义是内容、行为、性能和回滚证据共同闭环。恢复演练会在新索引追平前主动中断进程,再从断点继续,验证重复事件、乱序删除和未知结果不产生双文档;切流后抽样回源比对,旧索引下线前再完成一次反向回滚。
  • 追问:失败样本能否先跳过后上线?
  • 直接回答:只有明确业务允许且影响可量化时才可能隔离,否则漏文档、删除或权限会造成不可接受差异。
  • 追问:怎样判断增量能追平?
  • 直接回答:目标持续应用速率必须高于源端新增速率,并为失败重试、校验和高峰留余量。
  • 追问:为什么不能从旧索引直接复制?
  • 直接回答:分析器变更需要从原文重新生成词项,复制旧结构会保留要修复的旧语义。
  • 详情:重建与回滚
  1. 问题:跨境物流运单号、渠道名和轨迹搜索怎样落地?
  • 口述答案:我先把权威事实和搜索投影分开。运单、包裹、渠道编码、轨迹原始事件、事件时间、修正版本和删除保存在数据库或事件日志,搜索索引只保存可重建文档。字段上,运单号和渠道编码用 keyword(精确字段),支持大小写和连接符的可控规范;运单前缀可有受限补全字段,但模糊候选必须在租户、渠道和长度规则内。渠道标准名用精确字段,中文名、历史别名和拼音用独立低权重全文字段;轨迹描述使用领域中文分词和同义词,但“清关延误”不能与“已清关”因共享“清关”而错排。查询先识别完整运单号,精确路获得最高优先级;自然语言并行走轨迹全文与有限语义召回,多路候选按 租户+运单+事件版本 去重,再执行权限和数据域硬过滤。返回的轨迹状态、是否签收和渠道有效性要按业务需要回源确认,搜索高分不能更新事实。事件投影携带业务键、单调版本、删除和来源水位,重复与乱序按版本处理;索引滞后时,单运单精确查询可限流回源,全文列表明确降级。质量集覆盖完整号、错一位、不同连字符、渠道旧名、多语言轨迹、迟到修正和同词反例,精确号主看 MRR(平均倒数排名),轨迹列表看 NDCG(归一化折损累计增益)。词典或映射变更走双索引、影子比较、灰度别名和回滚,数据库与事件日志始终提供重建输入。项目验收还会注入运单改号、迟到轨迹、渠道合并、租户转移和索引重建,比较搜索与权威事件版本;客服界面展示索引水位与回源结果,避免把暂时滞后包装成确定状态。
  • 追问:相似运单号能否直接展示轨迹?
  • 直接回答:只能作为明确提示的候选,用户选择后还要以完整业务键回源,不能把编辑距离当同一实体。
  • 追问:轨迹全文高分是否代表最新状态?
  • 直接回答:不代表,最新状态由事件版本、时间和业务规则计算,相关性只表示文本匹配。
  • 追问:渠道历史名如何治理?
  • 直接回答:映射到稳定渠道编码,别名词典版本化,保留方向与有效期,并用同名不同渠道反例回归。
  • 详情:项目字段与权威边界
  1. 问题:WMS(仓储管理系统)商品搜索和 IoT(物联网)报警搜索有哪些不同?
  • 口述答案:两者都需要中文全文,却有不同业务目标和硬边界。WMS(仓储管理系统)商品搜索主要围绕 SKU(库存单位)、商品名、品牌、规格和库位。SKU(库存单位)与品牌编码用 keyword(精确字段),商品名做中文全文、原始精确名和低权重拼音,多元切分只给明确包含搜索字段;排序可结合精确命中、文本分数、可售展示和业务等级,但真实库存、防超卖、价格与库位状态必须由权威库存服务裁决。IoT(物联网)报警搜索围绕设备、租户、级别、规则编码、发生时间和报警描述;设备与权限字段精确过滤,描述可用领域同义词和向量辅助找相似现象,但“网络抖动”“设备离线”“传感器故障”不能因相似就当同一原因,确认、抑制、合并和关闭状态写权威事件与处置流水。质量上,商品关注前列相关、点击和拣选转化,报警还必须守护严重报警不漏、时间顺序和租户隔离;热门商品可适当业务重排,严重报警不能被点击量降权。故障降级也不同:SKU(库存单位)精确查询可限流回源,长商品全文不能扫主库;报警精确设备和时间可回事件存储,语义相似搜索可关闭。两者都通过业务键、版本、删除和事件水位构建可重建索引,词典发布走影子与双索引。不能用“加中文分词器”概括,因为字段模型、意图、硬过滤、评分、评测和恢复路径同样决定质量。上线后按商品和报警两套查询指纹分别监控,新词典先在各自领域影子验证;数据删除、租户撤权和设备归属变化必须传播到两类索引,并通过定期权威抽样证明已经收敛。
  • 追问:商品可售状态放评分还是过滤?
  • 直接回答:禁止展示不可售时硬过滤;允许展示缺货时可降权,但交易提交必须回权威库存校验。
  • 追问:相似报警能否自动关闭?
  • 直接回答:不能,语义相似只辅助检索,关闭和抑制要由规则、事件状态与人工处置裁决。
  • 追问:两类搜索共用一个词典好吗?
  • 直接回答:不宜无边界共用,领域词义不同,应按字段和业务域版本化并共享明确的基础规范层。
  • 详情:项目建模矩阵
  1. 问题:请总结搜索工程的核心设计思想,并说明版本未知时如何回答。
  • 口述答案:我的主线有五层。第一,搜索不是“能返回结果”就完成,而是召回和排序双目标:相关文档要进入候选,前列还要符合意图,零结果下降不能以误匹配换取。第二,倒排、词位、多字段、向量和预计算业务信号都是用空间、写放大与重建成本换低延迟;Lucene(全文检索库)不可变 segment(分段)让并发读稳定,却把更新转成删除标记、新版本和 merge(合并)。第三,同义词、模糊和 ngram(多元切分)会扩 Recall(召回率)也会损害 Precision(准确率)与资源,必须由标注集、意图门控和线上守护约束。第四,分治局部 Top-K(最高 K 个结果)只有在局部候选可压缩、局部排序与全局目标相容、协调归并可控时才提速;强后置重排会让被截断文档无法复活。第五,指标必须和业务目标、权限、延迟、投诉、资源共同使用,相关性得分不是库存、轨迹、报警状态或授权的正确性,数据库与事件日志始终是权威源。项目版本未知时明确写“待现场核对”。稳定机制可以讲倒排结构、分析链、不可变分段、候选与评分;版本敏感的分析插件、中文词典装载、默认相似度、BM25(最佳匹配 25)参数、缓存资格、脚本限制、向量融合、别名和重建接口进入核对卡。现场记录软件包、插件校验值、配置、映射、词典摘要、官方章节、实验输入输出、核对日期、适用边界和回滚索引。最小实验验证分析对拍、三文档得分、词典灰度、权限失效、脚本降级和双索引回滚,容量再用真实语料压测;不声称“最新版默认安全”。
  • 追问:为什么相关性分数不是业务正确性?
  • 直接回答:它衡量查询与索引文档的匹配信号,不验证库存、授权、事件版本或交易不变量。
  • 追问:版本核对卡最少记录什么?
  • 直接回答:实际版本、插件、配置、映射、词典摘要、官方章节、实验、日期、适用边界和回滚条件。
  • 追问:最小实验能替代容量压测吗?
  • 直接回答:不能,前者验证机制,后者用真实分布、并发、候选、合并和故障负载验证容量边界。
  • 详情:设计思想与版本卡

7. 复习与验收清单

  • 能用三篇完整文档复算 term dictionary(词项字典)、postings list(倒排表)、document frequency(文档频率)、term frequency(词频)、position(词位)、offset(偏移量)和 norm(归一化因子)。
  • 能解释词项定位、倒排表跳跃、交集与并集,并与 B-Tree(平衡树索引)的完整键和范围访问比较。
  • 能画出 character filter(字符过滤器)到 tokenizer(分词器)再到 token filter(词元过滤器),并对拍索引与搜索分析器。
  • 能区分 text(全文字段)、keyword(精确字段)、拼音、同义词与 ngram(多元切分)的收益和写放大。
  • 能选择精确、分析、短语、布尔、前缀、通配、模糊和多词门槛,并说明召回、成本与误匹配。
  • 能按表 10 复算 BM25(最佳匹配 25)三文档得分,并说明权重、函数评分、时间衰减和脚本边界。
  • 能口述“意图 -> 分词 -> 多路召回 -> 初排 -> 业务重排 -> 权限/库存过滤 -> 去重 -> 返回”全链路。
  • 能用 Precision(准确率)、Recall(召回率)、MRR(平均倒数排名)、NDCG(归一化折损累计增益)、零结果、点击与转化共同评测。
  • 能执行词典版本、双索引重建、影子查询、结果差异、灰度别名和回滚,并说明为何分析器变化常需重建。
  • 能按两类证据、止血、修复和回归处理零结果、错误匹配、分词不一致、字段爆炸、脚本慢、高基数、深分页、缓存误判、回归、热点和重建失败。
  • 能把跨境物流、WMS(仓储管理系统)、IoT(物联网)和运营权限绑定到搜索投影,同时坚持数据库与事件日志为权威源。
  • 能明确项目版本“待现场核对”,并以版本卡、最小实验、真实语料压测和回滚索引验证敏感行为。