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

关于全文搜索引擎的选择,小型后端项目用 Elasticsearch 合适吗?

  •  1
     
  •   yodhcn · 48 天前 · 4567 次点击
    这是一个创建于 48 天前的主题,其中的信息可能已经有所发展或是发生改变。
    楼主今天刚了解到 "全文搜索引擎" 这一概念 —— 传统的关系型数据库,比如 MySQL,一般不适合做关键词搜索,关键字搜索最好配合全文搜索引擎使用。

    在网上搜索 "全文搜索引擎" ,大家推荐的都是 Elasticsearch,一个企业级的搜索引擎。

    实际上,楼主正在开发一个类似 emby 或 plex 的个人媒体服务器,数据量自然不会太大,于是就选择了 sqlite 这一文件型数据库,来存储视频 /音频的元数据。
    这种级别的后端应用,自然用不到 Elasticsearch 这么重的工具,也没有数据分析的需求,但还是要解决 "搜索元数据中的关键词" 这一问题。

    所以,想向大家请教 2 个问题:
    1. 对于小型后端项目,有哪些适合的比较轻量的全文搜索引擎?或者其它解决关键词搜索的方案?
    2. 那些博客应用、小型论坛应用都是怎么解决全文搜索的?
    第 1 条附言  ·  47 天前
    虽然 sqlite 也有 fts5,但找不到支持 CJK 的第三方 Tokenizer,
    为了省事,楼主决定将数据库换成 MySQL, 并使用 MySQL 内置的 ngram 全文解析器,
    感谢诸位的指点
    49 条回复    2021-02-02 16:13:15 +08:00
    cs3230524
        1
    cs3230524   48 天前
    合适
    codehz
        2
    codehz   48 天前   ❤️ 1
    (是否选用 sqlite3 的唯一考量因素是有没有横向扩展的需求,没有的话,即使全文搜索这种需求也可以在 sqlite3 里做。。
    比如用 sqlite3 内建的 fts5(中文的话比较麻烦,但是也有能用的第三方分词,可以自己整进去)
    GoLand
        3
    GoLand   48 天前
    做好 seo,然后直接用谷歌搜索,类似 v 站的搜索功能。
    340244120w
        4
    340244120w   48 天前 via iPhone
    Es 基于 lucene 的 所以可以考虑 lucene
    beyondex
        5
    beyondex   48 天前
    合适。如果是 .NET 可以用 Lucene.NET 如果是 Java 可以用 lucene,但是用起来其实比直接用 ES 写代码要复杂一些。
    newbieRenew
        7
    newbieRenew   48 天前 via iPhone
    由第三方全文搜索的工具,你搜一下
    zhuangzhuang1988
        8
    zhuangzhuang1988   48 天前
    合适
    xcstream
        9
    xcstream   48 天前
    不合适 内存占太大
    crynocry
        10
    crynocry   48 天前
    尝试一下 MySQL 全文索引
    shuangya
        11
    shuangya   48 天前
    不合适。小型直接 mysql 就够了。
    mysql 512M 内存就可以跑起来。
    es 没有 2G 就别跑了。
    idblife
        12
    idblife   48 天前 via iPhone
    数据量小的话不合适
    mysql 查呗,小数据量全表也没事
    niubee1
        14
    niubee1   48 天前
    数据量不大的话可以试试 Redisearch
    leafre
        15
    leafre   48 天前 via Android
    直接 lucene
    love
        16
    love   48 天前 via Android
    杀鸡用牛刀了,之前有人推荐过一个很轻量的也比较流行的,忘了叫什么搜一搜可能搜到
    DoctorCat
        17
    DoctorCat   48 天前
    是否合适,重点是要看成本。
    anUglyDog
        18
    anUglyDog   48 天前
    MySQL 内置中文分词引擎 ngram
    CODEWEA
        19
    CODEWEA   48 天前
    不谈实际,空谈技术都是扯淡,你不得先确定需求吗?
    izgzhen
        20
    izgzhen   48 天前
    AWS 上的 ES 成本还是比较弹性的,不知道其他☁️如何
    yzbythesea
        21
    yzbythesea   48 天前
    博客之前用的就是一个 javascript 写的搜索,原理就是 regex 指定的文本。
    yrj
        22
    yrj   48 天前 via iPad   ❤️ 1
    数据量小,建议直接 sqlite 自带的全文检索,我用过没问题的。单个人不是很推荐 sqlite 做生产数据库。
    veike
        23
    veike   48 天前 via Android
    @yzbythesea 太弱了
    zjsxwc
        24
    zjsxwc   48 天前 via Android   ❤️ 1
    偏个题
    mysql5.7 之后就支持中文全文搜索了 ngram
    Jackeriss
        25
    Jackeriss   48 天前 via iPhone
    github 上也有不少小型搜索引擎项目
    dick20cm
        26
    dick20cm   48 天前
    @anUglyDog 这个不是中文分词,ngram 就叫做 ngram
    update
        27
    update   48 天前   ❤️ 1
    中小型的尝试下
    redissearch
    manticoresearch
    sphinx
    xuanbg
        28
    xuanbg   48 天前   ❤️ 1
    楼主是不是对“重”有着什么误解?什么叫重?
    1 、使用、管理、维护需要专门的人才,这个叫重
    2 、使用的代价高昂,应用本身或应用工作所需的硬件资源需要花费巨额资金,这个叫重
    3 、没有第三了……

    ES 重吗?完全免费!一行 docker 命令就能完成安装,几乎不需要配置,spring boot 已经集成了客户端,这个能叫重?
    至于使用它所需要的资源,cpu 取决于你的业务量,内存 /存储取决于你的内容。既然你没啥访问量,内容也不多,那基本上就是 docker 镜像占用个几百兆硬盘空间而已。你管这个叫重?
    chinesestudio
        29
    chinesestudio   48 天前 via Android
    solr
    icyalala
        30
    icyalala   48 天前   ❤️ 3
    @xuanbg 你是不是对楼主想问的 "重" 和 "轻量" 有什么误解?
    mywaiting
        31
    mywaiting   48 天前
    要是用 PostgreSQL 增加全文搜索也就是分分钟的事情,tsvector 搞定所有搜索

    当然了,这是中小型网站的选择,你要是打算到 Google 搜索这级别,就当我什么也没有说过吧
    lemy
        32
    lemy   48 天前
    @GoLand 实话说这样还不如自己上 es,也要考虑后期的拓展。依赖搜索引擎做自己的搜索功能是不现实的。
    pc10201
        33
    pc10201   48 天前
    阿里云直接有搜索服务,自动同步 mysql
    est
        34
    est   48 天前 via Android
    > 楼主正在开发一个类似 emby 或 plex 的个人媒体服务器,数据量自然不会太大

    建议直接 mysql ngram
    mtrec
        35
    mtrec   48 天前 via Android
    但还是要解决 "搜索元数据中的关键词" 这一问题

    需求这么简单自己写个分词倒排索引不就好了?
    notejava
        36
    notejava   48 天前
    Elasticsearch 重了点,Lucene 就可以满足
    KevinBlandy
        37
    KevinBlandy   48 天前
    也许可以试试看 redissearch
    imn1
        38
    imn1   48 天前   ❤️ 1
    我想问有什么元数据的关键词需要搜索?就是什么需求?

    个人服务的话,建议还是免装数据库(暂时就 sqlite 合适),其他所有需要安装的数据库,都不适合备份导出
    注意用户群中懂导入导出的恐怕不足 5%,媒体越多,库越大,意味着这个用户前期输入组织的工作量越大,基本不可能在崩溃后重新再组织一次,如果做不到原样回复,那就是一次抛弃型软件

    经验:
    我目前一万五千个视频文件,就已经 50T 硬盘了,找到视频的路径位置是第一需求
    我的意思是,大视频的话,数量少一点,但存在分盘问题,小视频的话,数量多一点,但个人较难逐个输入数据,肯定有他自己的一套提醒记忆方案,这个方案一般不会太复杂(否则不好记),但比较个性化,其他人不适用
    所以做这种个人服务项目,做成泛化功能用途不大,反而需要一些个人定制的功能,反正就是不好做

    个人觉得,以数据量来说,sqlite 足够了,很难想像个人的媒体,在不计算图片前提下能达到百万级,如果真达到百万级(例如包含图片),元数据一定不会太复杂,因为对那个用户来说,百万级手动输入不太可能,自动获取又难以满足他的记忆提醒需求,时间、地点、TAG,超出这些的个性化需求就不是软件制作人能想到的了

    不必太担心全文搜索了,这不是个人媒体库的难点
    lewis89
        39
    lewis89   48 天前
    @xuanbg #28 轻重看场景的,人家用的 sqlite 这明显是针对 NAS 以及个人用户的
    lewis89
        40
    lewis89   48 天前   ❤️ 1
    别考虑这么多,针对终端用户的东西,还动不动考虑性能... 真的是没有意思,个人用户撑死能存个几万部电影,这种场景 性能不是首先需要考虑的问题。
    areless
        41
    areless   48 天前 via Android
    sphinx 超强的
    yodhcn
        42
    yodhcn   48 天前
    @imn1 #38 元数据直接通过爬虫爬取,包括:标题、封面图片 url 、标签、系列名、演员名、上映日期、作品介绍 (TEXT 类型) 等内容,再有就是扫描磁盘得到的影片存储路径。

    其实我最开始想问是另一个问题,https://www.v2ex.com/t/743359#reply6

    老哥你的意思是:
    1. 虽然 sqlite 也有 fts5,但如果只从 "标题、标签、系列名、演员名、上映日期" 这些 VARCHAR 类型的字段搜索关键词,是不是就没必要用 "全文搜索" 来做,直接把它们拼接成一个新字段 search,再在这个字段里搜索 "WHERE search LIKE '关键词''" 就够了?
    2. 虽然这么搜索没有索引,但由于数据量不大,所以不用考虑性能与效率问题?


    @imn1 #38
    codehz
        43
    codehz   48 天前
    FTS5 可以索引多个列的,没有任何问题,还能做约束从不同列搜索内容。。实现类似谷歌的那种搜索语法(当然为了用户友好性你还是得自己转换一下)
    imn1
        44
    imn1   48 天前   ❤️ 2
    @yodhcn #42
    Y,性能不是大问题,最难的地方还是怎么提供一些个性化需求(说的不是皮肤)

    sqlite 有两个好用的东西,其他数据库应该也有,没详细考究
    1. || 连接符,拼接多个字段
    2. 自定义函数,注册为 sqlite 函数,这个就好多事情可做了

    说几个我遇到的难点吧,至今还没自己满意的解决方案
    1. 举个例子
    输入:严正花、严正华、严晶华……任一,如何“智能”搜到 严正化(这个是数据库中正确的名字)
    意思是,用户输入是随意的,但数据是归一的,如何能做到两者合理匹配
    为了这个搞个 AI 不值得,模糊匹配准确度又低

    自驾网经常见到这样的帖子:这个女的叫什么?有什么番号? —— 以图搜车
    岛国有个素人大全数据库的网站,那叫一个全啊,曾经用什么名字出现在哪个产品都能搜出来

    2. 你只考虑了公众化的内容,个人服务有个很大的需求是自己的内容,例如各种自拍、生活记忆、旅行影像等等,这些就需要很强的自定义数据字段 —— 批量输入、单独输入、个性化标签、归类、自动识别(人脸?)……等等
    举个例子:电话录音的整理

    3. 文件改名、移动,尤其是跨盘移动
    如果在管理软件内操作,如何处理大量文件 IO,有可能几百 G 移动哦(westworld 4K 一季就这个量了),自己写的话,不但不好使,出 BUG 可能性也极高
    如果不是在管理软件内操作(例如用三方复制软件操作),如何方便又准确地,在移动操作后重新匹配数据

    还有其他复杂问题,只是我需求比较狭窄,没遇到

    反正搜索性能是小事,但优化肯定还是要做的,不能事小而不为,重点放在个性化的数据录入,以及备份恢复吧
    airfling
        45
    airfling   47 天前
    hibernate search 其实也可以
    ffxrqyzby
        46
    ffxrqyzby   47 天前
    你个人媒体, 我感觉直接 grep 就够了....
    最多几百兆文本?内存一加载就行了, es 是有点太重了, 不过还是看你选择了, 玩玩 es , 了解一下也挺不错
    encro
        47
    encro   47 天前
    mysql ngram 刚好用过,送给你:

    https://c4ys.com/archives/2098
    jiahonzheng
        48
    jiahonzheng   43 天前
    dbpe
        49
    dbpe   25 天前
    @jiahonzheng 这个好像没有评分系统...一但花里胡哨起来..应付不过来啊
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2733 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:49 · PVG 17:49 · LAX 01:49 · JFK 04:49
    ♥ Do have faith in what you're doing.