如何低成本解决模糊搜索问题

2022-05-26 17:43:58 +08:00
 brader

用的 mysql 数据库,有时候做业务,动不动产品就会说,这个字段我要模糊搜索。 实在不想大费周章,直接用的 like ,前期还好,到了后面跑不动,还有没有其他低成本的替代方案?

4998 次点击
所在节点    程序员
53 条回复
aikilan
2022-05-27 16:05:18 +08:00
你就在群里告诉产品这样会越来越慢呗,产品要是没意见,后果他就自己承担。
Features
2022-05-27 16:07:21 +08:00
啊? 老版 discuz 不是有完善的方案吗?
1.限制字数
2.限制搜索频率
3.必须登录后搜索
还有很多我都忘记了
zhangwugui
2022-05-27 16:08:21 +08:00
mysql5.7 的 ngram 尝试过,我记得是有点问题的:
1 )有些高频数据可能搜不到;
2 )搜索时间可能时快时慢,
3 )查询条件过长,还可能触发 cache limit ;
raptor
2022-05-27 16:09:26 +08:00
30 楼正解,得让产品知道每个需求都是有成本的,实现模糊查询是一个成本,实现高性能的模糊查询是另一个成本。
hatsuyuki
2022-05-27 16:10:40 +08:00
小规模数据 meilisearch 最合适,性能高,消耗少
dog82
2022-05-27 16:59:31 +08:00
这个帖子有营养,大家思路好广
donfisher
2022-05-27 17:03:03 +08:00
1. mysql 做全文索引
2. 果断上 es
brader
2022-05-27 17:09:36 +08:00
@meystack 请问下你这个迅搜项目,可以有自带组件解决 mysql 表数据的全量同步和增量同步的增删改 同步方案吗?还是要自己通过代码进行推送
meystack
2022-05-27 18:21:57 +08:00
@brader 那没有,如果需要同步的话,有两种方案

1 、在 PHP 读写的时候,如果有更新可以直接更新迅搜的数据,如果有并发的话就做队列
2 、自己写 C 扩展去实现,xunsearch 其实就是监听了两个端口,只需要投递和查询相应的数据就行了,
如果你们技术那边没问题,可以使用 mysql 类似的同步工具,自定义数据结构转换成 XS 对应的东西进行投递更新就行了
这样可以脱离 PHP ;保持 mysql 同步
Saxton
2022-05-27 23:08:46 +08:00
小公司不要上 ES ,你确定公司能给你提供好的服务器资源?,到头来资源不够还天天炸,meilisearch 也可以考虑下,如果真想在压低成本就像楼上说的只读从库,也可以考虑 mysql 的分词,虽然不咋样但勉强可以满足需求。
heyjei
2022-05-28 10:36:26 +08:00
当年用 PHP 搞论坛的时候,那时还没有 ES ,分词也没有这么方便。

PHPBB 有一个骚操作叫基于二分分词的倒排索引,不管是搜索的准确性和速度,效果都很不错。特别适合你这种情况。

思路就是把一篇文章的按两两分词插入到另外一张倒排索引表,然后搜的时候,把搜索词也二分分词,去查那张倒排表。

两两分词的意思就是:当年用 PHP 搞论坛的时候 可以分词为:当年、年用、用 P 、PH 、HP 、P 搞、搞论、论坛、坛的、的时、时候。

适合这种文章的数量比较少的情况。
zhangwugui
2022-06-01 10:27:05 +08:00
@heyjei 这个之前尝试过,这种方式是 分词+倒排索引,最后两张表进行关联,我最近进行测试,发现这种有三个小问题:
1 )分词表会很大;
2 )单个汉字进行搜索有问题(可以从产品端避免)
3 )文章内容有回文的情况查询会有问题;

中国商标专利事务所有限公司务专

搜:"专利事务", 查询过滤为:IN ('专利','利事','事务'),能正常搜出来;
搜:"事务专利", 查询过滤为:IN ('事务','务专','专利'),也能搜出来,但正常是搜不到这条数据;
heyjei
2022-06-01 23:02:39 +08:00
@zhangwugui 第一个问题其实还好,常用汉字就 2500 字,两两组合也就 6250000 行

最后一个问题叫 Feature ,智能模糊搜索,>_<

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

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

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

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

© 2021 V2EX