亿级订单表 要对物流追踪号支持 LIKE %123% 这样的前后缀都模糊查询 的细节补充

48 天前
 drymonfidelia
/t/1086192 这个需求已经有非常多用户反馈了,产品经理一直在催上线,所以我周末晚上来发帖。昨天太晚了(不在国内)发完就去睡觉了,没看大佬们的讨论,因为已经快 70 条回复了,所以新开一贴补充细节

这套系统是给其它网店用的 SaaS ,总订单量有几亿条,需求是各店需要能模糊搜索自己店的物流追踪号。各店的订单量不固定,有的店有几千万条,有的店是来测试系统的只有几条
因为用户经常反馈问题的时候是直接扔张截图甚至模糊不清的照片,OCR 也不太好处理,所以需要模糊搜索追踪号

总结了下大家的评论一共几种方案:

单独用一张表存自己店追踪号:这样查询效率为什么会比从总表查高呢?不是一样还是不能走索引,如果是 SELECT 一家店的全部追踪号再筛选,和从总表 SELECT 有什么区别呢?
单独用一张表存逆序的追踪号:产品经理那边测试了同行的产品,确实支持从追踪号中间搜索,不知道是怎么实现
ClickHouse 和 MySQL 全文索引:有人提到这种方案依赖分词而追踪号不能分词
1609 次点击
所在节点    数据库
5 条回复
giantreaper0
48 天前
ngram 切片,即每三个字符创建一项索引,比如 abcdefg ,就有 abc, bcd, cde, efg 四套。ES 好像是支持这种分词的
giantreaper0
48 天前
@giantreaper0 补充一下,不是三个,是自定义 n 个,例子里是 3
Gilfoyle26
48 天前
单独存一张表,不用 innodb
czjxy881
48 天前
es 里 ngram 分词器,支持配置 min_gram 和 max_gram, 若 min=1,max=4 对于 abcd 就会变成 a,b,c,d,ab,bc,cd,abc,bcd,abcd 这么多 term ,对于随便一个命中的,都可以做到毫秒级召回亿级数据。本质上是用空间换时间。 若是不想空间占用过多,也可以 xgram 后用 match_phrase_prefix
BanShe
47 天前
@czjxy881 感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1086471

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX