news 2026/6/9 22:46:51

记录一次伟大的实践--上亿数据快速模糊匹配方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
记录一次伟大的实践--上亿数据快速模糊匹配方案

问题:

一千二百万条url ,还有1亿1千万的关键词,关键词一定出现在某条url的名字里,但是关键词不完全和名字相等,并且可能一个关键词同时出现在多个url中,所有和关键词匹配的url都要列出来

背景:

最开始没有想到会处理这么多数据,果断采用以下最省力的方案,半小时测试数据顺利通过,果断收钱完工,客户拿到脚本跑一下午都没出结果,来售后了,一顿排查,脚本没问题,再问数据,谁成想有上亿的数据要处理!!!
欧麦嘎的,要了老命了,方案1运行完估计要将近36小时,收人家票子了,没办法,改吧……然后就有了灵关一现的方案2
没有任何经验可谈,纯纯被逼出来的想法
不得不说Gemini 是真好用,ql_query就是它给我改出来的(顺便夹带点私货:我这有Gemini成品号,绑定教育机构的,50大洋一个,售后30天,前几天的大规模封号事件,我们这一个都没封,售后期内封号包换(不限制次数)

方案1

第一反映,直接把url 拆成map, key=url的name value=url ,然后遍历 关键词,遍历map,关键词在key里就记录value

解析1

小批量数据能用,但是太慢了,每条关键词都要扫描一遍map,太TMD蠢了,而且对内存占用极大 ,多线程OOM

方案2

把url 拆开 name 和url ,导入mysql 中,并且把name字段建立全文索引

CREATETABLEIFNOTEXISTSall_urls(idINTNOTNULLAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255)NOTNULL,urlTEXTNOTNULL,FULLTEXTINDEXidx_name_ft(name)-- 在这里直接定义全文索引)ENGINE=InnoDB;

查询语句

# 重要的是这里不要使用 select url from all_urls where name like '%%' ,这种会导致全文索引直接失效了,效率及其低ql_query=""" SELECT url FROM all_urls WHERE MATCH(name) AGAINST(:search_term IN BOOLEAN MODE) """# source_name 就是要查询的关键字search_term=f'"{source_name}"'params={'search_term':search_term}# with db_pool.get_session() as session: 这使用sqlalchemy实现的,自己写就的了withdb_pool.get_session()assession:res=session.execute(text(sql_query),params)

解析2

使用此方案处理时间从方案1 的5个线程运行天级别,降低到了单线程运行分钟级别

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 8:57:52

突破语音合成边界:微软VibeVoice-1.5B技术深度剖析与实践指南

突破语音合成边界:微软VibeVoice-1.5B技术深度剖析与实践指南 【免费下载链接】VibeVoice-1.5B 项目地址: https://ai.gitcode.com/hf_mirrors/microsoft/VibeVoice-1.5B 在语音合成技术领域,传统文本转语音(TTS)系统长期…

作者头像 李华
网站建设 2026/6/8 15:47:17

10、MySQL、邮件服务与企业应用实践

MySQL、邮件服务与企业应用实践 数据库选择依据 在设计不同类型的应用时,数据库的选择至关重要。对于人力资源应用,由于数据具有关系性,如员工的姓名、社保号码、工资等相关信息,选择关系型数据库是合适的。而对于多媒体应用,像照片、视频和艺术作品等,对象数据库更为流…

作者头像 李华
网站建设 2026/6/8 14:36:22

21、BIND与DHCP在DNS中的应用详解

BIND与DHCP在DNS中的应用详解 1. 反向查找区域文件 在示例反向查找区域文件中,存在一个针对网络 10.1.1.0/24 的反向区域。 $ORIGIN 指令是可选的,但它能让区域文件更易读,该指令主要用于补全未完全限定的资源记录(RRs)。例如,当使用IP地址 10.1.1.[1,2,6] 时, …

作者头像 李华
网站建设 2026/6/8 15:00:11

27、Linux 系统故障排查与性能优化指南

Linux 系统故障排查与性能优化指南 1. 进程排查工具——ps 命令 在排查进程相关问题时, ps 命令非常实用。以下是几个常见的 ps 命令选项及示例: - 查看进程运行时间 :可以帮助解决内存耗尽问题。例如,查看 init 和 rsyslog 进程的运行时间: $ ps -eo pid,c…

作者头像 李华
网站建设 2026/6/8 14:35:40

mysql的列为什么要设置not null default ‘‘?

1.如果不设置,那么会出现空字符串和null一起存在的现象 2.如果这个字段是索引,那么会为空字符串和null都存储在二级索引中 3.存储占用更多的二级索引空间,还需要考虑null值查询的特殊处理 4.没有空字符串等值查询效率高,如果设置n…

作者头像 李华
网站建设 2026/6/9 5:52:58

41、树莓派硬件接口与软件应用全解析

树莓派硬件接口与软件应用全解析 1. Gertboard编程 Gertboard编程与底层Arduino代码颇为相似,都是直接对内存映射的输入输出(IO)进行操作,这就要求具备汇编程序员的精细技能。以下是一段示例代码: PWMCLK_DIV = 0x5A000000 | (32<<12); PWMCLK_CNTL = 0x5A0000…

作者头像 李华