漏洞修复与索引优化:提升搜索引擎性能
|
漏洞修复与索引优化:提升搜索引擎性能——这八个字,我去年秋天在“知网学术搜索V4.3”灰度上线时亲手贴在测试服务器的机柜侧面,用记号笔写的,油墨还没干透就收到第一条404链漏报告。 去年秋天,我们给某省级政务服务平台做搜索重构,原系统依赖Elasticsearch 6.8自带的默认分词器,但中文地址字段(如“北京市朝阳区建国路87号院2号楼B座1809室”)在倒排索引中被错误切分为“建/国/路/87/号/院/2/号/楼”——导致用户搜“建国路87号”召回率仅53.7%,比旧版Apache Solr还低11个百分点。团队花17天重写地址实体识别规则,接入自研的GeoNerLite模块,把地址片段识别准确率推到98.2%,可上线第三天凌晨2:17,监控告警显示/_search接口响应P95延迟从320ms飙到2100ms,日志里全是“circuit_breaking_exception”。查了6小时才发现——新分词器生成的term向量体积膨胀3.4倍,触发了ES默认的fielddata circuit breaker阈值,而这个阈值在集群配置里被上个运维同事手动注释掉了,注释内容是:“反正没人搜这么长的地址”。 新技术。 我们试过Lucene 9.6的BlockMaxScoreQuery,理论上能跳过大量非竞争文档,实测QPS提升22%,但某次批量索引127万条医疗科普文章时,它把含“血小板减少性紫癜”的长尾query直接干进timeout——因为它的跳过逻辑会误判部分同义扩展词为“低相关”,而我们的同义词库恰恰在三天前刚合并了卫健委2023版术语表,里面“ITP”和“免疫性血小板减少症”被标为等价,但BlockMaxScoreQuery不认这种跨域映射。后来换成自己写的动态skip-list索引层,加了fallback开关,失败率压到0.03%以下,不过CPU占用高了19%——这个数字是我盯着Prometheus面板抄下来的,凌晨4:23分,屏幕反光里映着我的黑眼圈。
文章配图,仅供参考 某天下午三点,测试同学举着手机冲进会议室:“搜‘新冠口服药医保报销’,首页出来的是2021年辉瑞Paxlovid谈判新闻,但医保局上周刚发红头文件更新了报销目录!”——排查发现是URL去重模块把新老页面判定为“内容重复”,因为两个页面都包含同一段卫健委标准说明文字,而我们的simhash指纹没加时间戳维度。补丁打了三次才稳住,第三次终于在hash前插入了<meta name="last-updated">值。这个坑,我在2015年做知网CNKI搜索时也踩过,只是那时用的是MD5+截断,现在换成了minhash+LSH,但本质还是那个老问题:静态指纹搞不定政策类信息的时效脆性。 漏洞修复与索引优化:提升搜索引擎性能——这八个字现在挂在我工位斜对面的白板上,底下用荧光笔画了个箭头,指向“待验证:OpenSearch 2.11的adaptive replica selection是否真能缓解查询抖动”。不过下周得先去参加政务云安全合规评审,他们要求所有索引API必须过等保三级渗透测试——但测试用例清单里,压根没列“分词器注入”这一项。我有点拿不准,要不要主动提? (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

