V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
webeasymail
V2EX  ›  Java

有什么好用的轻量级搜索服务?

  •  
  •   webeasymail · 2024-08-03 09:34:30 +08:00 · 8436 次点击
    这是一个创建于 394 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前我在做一个 [ SaaS 软件分销平台] ,里面大概会有不超过 1W 条数据吧,假设一年后有 10W 条数据,现在我需要找一个非常轻量级别的搜索组件。

    这是一个单机版的系统,未来访问量也不会很大,我希望够对搜索效果进行提升,请问有什么好的技术可以使用?


    我不太想使用 es ,主要是 es 很重,我们的数据量很少,而且没有分布式需求,未来数据量稍微多一些,我准备单独拆出来一台机器做 search 服务即可。


    目前使用的是 mysql 的 like ,没有权重等等,所以效果还是很差的。

    前端使用的是 next.js 后端现在使用的是 java 。



    访问这个地址可以预览这个功能:

    https://www.cpcat.cn/s/wework
    第 1 条附言  ·  2024-08-03 19:06:51 +08:00
    感谢各位小伙伴的建议,目前已经尝试了 meilisearch 和 redisearch ,占用资源都超低,速度都非常快,meilisearch 目前好像 java sdk 兼容性有问题,已经提交 github ,redissearch 使用下来没有什么问题,应该会在这两个里面选择一个使用,相对来说能够解决以下几个问题:

    1 、支持 name 、tagline 、company_name 、categorys 设置不同的权重。

    2 、支持 搜索结果 高亮。

    3 、支持 content 自动截取字段。。

    4 、支持 score 和 自定义字段排序。
    49 条回复    2025-01-09 14:24:00 +08:00
    dilu
        1
    dilu  
       2024-08-03 09:48:27 +08:00
    meilisearch
    2bad4u
        2
    2bad4u  
       2024-08-03 10:06:41 +08:00
    @dilu 中文分词难搞
    dyllen
        3
    dyllen  
       2024-08-03 10:10:39 +08:00
    sphinx 老牌的了。
    concernedz
        4
    concernedz  
       2024-08-03 10:10:39 +08:00
    对文章,博客类来说,meilisearch 够用了
    potatowish
        5
    potatowish  
       2024-08-03 10:12:13 +08:00 via iPhone
    试试 redis search
    2bad4u
        6
    2bad4u  
       2024-08-03 10:32:54 +08:00
    @concernedz meilisearch 支持拼音搜索吗?
    flyingfz
        7
    flyingfz  
       2024-08-03 10:41:19 +08:00
    https://github.com/zincsearch/zincsearch

    看看这个 是否合适。
    webeasymail
        8
    webeasymail  
    OP
       2024-08-03 10:41:58 +08:00
    @potatowish 我在考虑 redis search ,我不太清楚使用 redis search 分词、高亮、权重是否能够解决?
    webeasymail
        9
    webeasymail  
    OP
       2024-08-03 10:44:54 +08:00
    @dilu Meilisearch 看起来也很轻量级,看资料和 redis search 一样,内置中文分词。
    webeasymail
        10
    webeasymail  
    OP
       2024-08-03 10:45:41 +08:00
    @dyllen 我数据用的是阿里云的,sphinx 可以结合云数据库一起用吗?
    DefoliationM
        11
    DefoliationM  
       2024-08-03 10:48:18 +08:00
    bleve 嵌入式的,直接存本地。
    webeasymail
        12
    webeasymail  
    OP
       2024-08-03 10:49:08 +08:00
    Meilisearch 看起来好像很强大 :

    eiliSearch 是一个功能强大、快速、开源、易于使用和部署的搜索引擎,并且 MeiliSearch 的搜索和索引都是高度可定制的,提供开箱即用的功能属性,如错字容忍、过滤器和同义词。而最重要的一点是,它 [支持中文搜索] ,而不需要添加额外的配置。


    二、支持的功能
    开源
    用户量(开源搜索引擎第二名)
    中文分词
    同义词
    纠错
    高亮
    全文返回
    高级搜索
    停用词、停用字段
    加权、降权
    逻辑搜索
    唯一字段聚合
    分页
    重新索引
    changdy
        13
    changdy  
       2024-08-03 10:52:15 +08:00
    你这个从产品思路上就错了..
    首先要做的是软件分类 ,而不是文章内容查询.
    看了下你做的软件分类太过于粗糙了.

    其次可以再给文章打标签 ,对标签进行搜索 最后搜索只查标题就好了..谁也不会闲着没事记软件的内容的.
    sampeng
        14
    sampeng  
       2024-08-03 11:01:34 +08:00 via iPhone
    实在要搜索引擎:sonic ,效率奇高。

    10w 就要上搜索引擎了?这是什么赛博世界…100w 数据库你就是一个字段一个字段 like 都够你用了。如果是 pg ,pg 自带的向量 token 存储,我试过亿级数据都是 100ms 就能回来,只要自己随便找个分词引擎。
    sampeng
        15
    sampeng  
       2024-08-03 11:03:04 +08:00 via iPhone
    连分类都不做,全靠搜索不是自己折腾自己么
    webeasymail
        16
    webeasymail  
    OP
       2024-08-03 11:08:49 +08:00
    @changdy 有分类的,现在又 300 多个分类了,分类可以在这个界面看 : https://www.cpcat.cn/categories
    webeasymail
        17
    webeasymail  
    OP
       2024-08-03 11:10:28 +08:00
    有分类的 https://www.cpcat.cn/categories

    我是想通过关键词能够跟准确一下,例如 title 的权重高一些,description 的权重低一些,现在 like 搜索没有权重数据,会导致搜索出来 产品名称 ,可能会 description 的排在前面。
    webeasymail
        18
    webeasymail  
    OP
       2024-08-03 11:12:18 +08:00
    @changdy 请教一下,产品标签是自动打标签,还是发布的时候手动选择标签?
    webeasymail
        19
    webeasymail  
    OP
       2024-08-03 11:14:36 +08:00
    @sampeng 实际上主要是解决权重的问题,希望搜索的东西更符合用户需要,例如搜索 “微盟”,title 和 company_name 权重最高,其次就是 description 权重低一些。
    Makabaka01
        20
    Makabaka01  
       2024-08-03 11:24:20 +08:00
    这么一点量级,QPS 也很低,数据库 like 都够了,根本不需要纠结
    webeasymail
        21
    webeasymail  
    OP
       2024-08-03 11:28:37 +08:00
    @willx12123 like 高亮,分词什么的都需要处理,复杂度也高,做出来效果应该也不太好
    dayeye2006199
        22
    dayeye2006199  
       2024-08-03 12:01:06 +08:00
    新点版本的 mysql 自带 full text search 支持。分词索引什么的都支持
    Actrace
        23
    Actrace  
       2024-08-03 12:28:58 +08:00
    可以试试 sphinx
    shuimugan
        24
    shuimugan  
       2024-08-03 12:58:20 +08:00
    meilisearch ,丢了一千多万数据(40 个字段,其中 2 个大文本)进去,1c1g 跑得很舒畅,闲置时候只有二十多 MB 内存占用
    fuis
        25
    fuis  
       2024-08-03 13:35:38 +08:00
    meilisearch 主要的问题是升级,每次升级都需要重新导入导出。。
    sampeng
        26
    sampeng  
       2024-08-03 13:38:01 +08:00 via iPhone
    @webeasymail 产品没想清楚.这是伪需求。
    webeasymail
        27
    webeasymail  
    OP
       2024-08-03 14:04:54 +08:00
    @shuimugan 这性能也太强了吧,比 es 的内存占用少太多了
    webeasymail
        28
    webeasymail  
    OP
       2024-08-03 15:06:46 +08:00
    @fuis 目前没有什么升级需求,大不了重建数据。
    yufeng0681
        29
    yufeng0681  
       2024-08-03 15:08:52 +08:00
    @webeasymail #19 把数据库里的所有 title 和 Company 的数据 变成索引,搜索时候就能联想出来。能联想到的就优先查(详细描述不用 like ,因为肯定命中了。 其他条目的详情里面如果有同样的 key ,也不建议显示出来,这个其实是相关竞品数据)
    如果没有联想到,那就 三个字段都 like ,慢一点就慢一点,说明用户本身也没记住名字,大概率是记错了产品名字。

    新场景:用户关注某个领域的产品,希望按类索骥走马观花,所以:层级分类确实要做好
    mark2025
        30
    mark2025  
       2024-08-03 15:55:09 +08:00
    kran
        31
    kran  
       2024-08-03 15:56:22 +08:00 via Android
    JAVA 里竟然没人说 lucene
    webeasymail
        32
    webeasymail  
    OP
       2024-08-03 16:12:28 +08:00
    @yufeng0681 感谢指点,是应该在搜索里面加入分类筛选,通过搜索工具是希望更够更好提升体验。
    wxf666
        33
    wxf666  
       2024-08-03 16:12:41 +08:00
    最轻量简单的,应该是 1MB 的 SQLite 了吧。。

    案例就是手机端上的微信,全文搜索了吧。。


    [《微信全文搜索耗时降 94%?我们用了这种方案》]( https://cloud.tencent.com/developer/article/2220615 ) 里说:

    > 一个包含 100w 条中文内容、每条长度 100 汉字的 FTS5 的表查询三个词,optimize 状态下耗时 2.9ms

    > 100w 条内容每次写入 100 条的情况下,按照 WCDB 的方案执行 merge ,耗时在 10s 内。
    webeasymail
        34
    webeasymail  
    OP
       2024-08-03 16:26:40 +08:00
    @kran lucene 好像维护起来很麻烦,太久没用了,我记得以前手动维护好像挺麻烦的
    webeasymail
        35
    webeasymail  
    OP
       2024-08-03 19:02:33 +08:00
    @wxf666 这个有技术挑战,需要投入太多精力。
    webeasymail
        36
    webeasymail  
    OP
       2024-08-03 19:07:36 +08:00
    @2bad4u 这个更高级,我还真没有考虑过
    wxf666
        37
    wxf666  
       2024-08-03 19:32:41 +08:00
    @webeasymail 下载个开源 simple 中文分词插件,再写几行 SQL ,也会投入很多精力吗?
    FrankAdler
        38
    FrankAdler  
       2024-08-03 21:20:23 +08:00
    @shuimugan 1000w 占用内存多少呢,我测试 2000 条就 340M 了,万级别有点担忧啊
    shuimugan
        39
    shuimugan  
       2024-08-03 21:24:36 +08:00
    @FrankAdler 搜索得频繁的时候好像是五百多 MB 。创建索引的时候占用是高的,看你给的上限,有个参数 MEILI_MAX_INDEXING_MEMORY 可以设置。冷数据给高点配置,等索引创建完之后就可以降配了。
    webeasymail
        40
    webeasymail  
    OP
       2024-08-03 21:43:09 +08:00
    @wxf666 我看这个文章写了一大堆,做了好多特殊优化,看起来不是很容易使用的样子
    qweruiop
        41
    qweruiop  
       2024-08-03 22:47:27 +08:00
    今年开发的系统都用 meilisearch 了吧。。。速度奇快。。。
    FrankAdler
        42
    FrankAdler  
       2024-08-04 00:31:40 +08:00 via Android
    @FrankAdler 试了下内存能接受,那 2000w 的磁盘空间呢
    webeasymail
        43
    webeasymail  
    OP
       2024-08-04 08:12:27 +08:00
    @qweruiop 文档看起来也非常简单易用,比 redis search 使用更清晰,我现在使用版本好像有点冲突,默写方法使用会出现错误,提交个 github 看看能不能解决。
    yufeng0681
        44
    yufeng0681  
       2024-08-04 11:28:11 +08:00
    @webeasymail #32 其实竞品功能抄抄更快
    IT 桔子,专门介绍创业项目的,各种分类都有。https://www.itjuzi.com/
    webeasymail
        45
    webeasymail  
    OP
       2024-08-04 11:50:42 +08:00
    @yufeng0681 IT 桔子 还是比较复杂的,我这个是做 SaaS 软件分销 ,差别有点大,而且 IT 桔子涉及面很广,我这个更窄了,做太大了,搞不起来。
    pieerepeng
        46
    pieerepeng  
       2024-08-04 16:42:18 +08:00
    我也调研过这个需求,记录下。


    我们希望在边缘节点上搭建一个搜索引擎,需要占用的内存开销比较小,同时当数据比较大的时候,可以有效使用硬盘。


    我们一开始选择了 zincsearch ,选择它的原因是对 es 接口的兼容,不过这个团队弃坑了,以及它的权限做的比较糙
    https://github.com/zincsearch/zincsearch

    Github star 比较多的是:
    https://github.com/meilisearch/meilisearch
    https://github.com/valeriansaliou/sonic
    https://github.com/typesense/typesense

    我觉得: https://github.com/manticoresoftware/manticoresearch 可能是遗珠
    支持少量付费的话,Algolia 也是一个选择

    其实: https://www.meilisearch.com/docs/learn/what_is_meilisearch/comparison_to_alternatives
    这篇文档做了对比,可以看看。


    最后:
    1. 我们文档站用了:Algolia
    2. 主项目用了 pg 加一堆插件的方案,整体资源的占用最小。因为我们用了 citus ,未来做云原生支持的时候希望也能容易些

    op 1 万多条的规模感觉 meilisearch ,typesense 挑一个就好了
    ryalu
        47
    ryalu  
       2024-08-05 09:45:52 +08:00
    试试 openobserve ,zincsearch 团队搞得
    imtflin
        48
    imtflin  
       2024-08-05 14:27:25 +08:00
    meilisearch 现在的中文分词有很大的问题,某些情况根本不可用,将文字 pinyin 化,导致一系列的问题,官网目前暂时也没精力解决。
    gitxuzan
        49
    gitxuzan  
       235 天前
    meilisearch 批量插入数据会存在内存泄露,内存都没释放,修改 mapping 也是,离谱,不敢相信是 48k 的开源,重启恢复
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2555 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:24 · PVG 23:24 · LAX 08:24 · JFK 11:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.