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

2021-01-09 20:20:31 +08:00
 yodhcn
楼主今天刚了解到 "全文搜索引擎" 这一概念 —— 传统的关系型数据库,比如 MySQL,一般不适合做关键词搜索,关键字搜索最好配合全文搜索引擎使用。

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

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

所以,想向大家请教 2 个问题:
1. 对于小型后端项目,有哪些适合的比较轻量的全文搜索引擎?或者其它解决关键词搜索的方案?
2. 那些博客应用、小型论坛应用都是怎么解决全文搜索的?
10198 次点击
所在节点    Elasticsearch
51 条回复
areless
2021-01-10 14:39:15 +08:00
sphinx 超强的
yodhcn
2021-01-10 14:40:17 +08:00
@imn1 #38 元数据直接通过爬虫爬取,包括:标题、封面图片 url 、标签、系列名、演员名、上映日期、作品介绍 (TEXT 类型) 等内容,再有就是扫描磁盘得到的影片存储路径。

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

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


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

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

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

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

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

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

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

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

https://c4ys.com/archives/2098
jiahonzheng
2021-01-14 23:45:04 +08:00
dbpe
2021-02-02 16:13:15 +08:00
@jiahonzheng 这个好像没有评分系统...一但花里胡哨起来..应付不过来啊
Arnie97
2021-07-08 12:22:18 +08:00
虽然这个帖子已经过去半年了,还是回复一下楼主的第 1 条附言:
SQLite FTS5 可以用 ICU 或者 Simple 作为中文分词器,不过一般客户端上才这么折腾,服务器直接用 Postgres GIN 索引或者 MySQL ngram 索引是不错的选择
https://blog.zhimingwang.org/compiling-sqlite3-with-icu-tokenizer
https://github.com/wangfenjin/simple
bigtang
2023-06-02 12:40:08 +08:00
单机搜索引擎参考 tanglib.com, 可以做到 instant search

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

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

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

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

© 2021 V2EX