实现 Matrix Synapse 中文搜索

2024-08-04 14:50:51 +08:00
 gal

Matrix 很好很强大,一般服务端都用 Synapse ,支持的协议最完善,然而它的中文搜索很难用,原因在于 PostgreSQL 未能正确的给中文分词。另一个服务端项目 dendrite 支持 CJK (中日韩)分词,也只是略好一些,并且那个项目开发也几乎停滞了。 开源 IM 软件中原生支持中文搜索的有 Mattermost ,我参考它给 Synapse 开发了一个方案,具体的做法是 使用 Zhparser 插件版 Postgres ,给数据表添加一个字段,改少量 Synapse 代码。通过文件映射的方式,尽可能减少后期维护成本。

写了一篇文章分享这种方案:《给 Matrix Synapse 添加中文搜索》

1535 次点击
所在节点    程序员
14 条回复
pieerepeng
2024-08-04 15:29:15 +08:00
支持一下。有种 08 年看如何给 android 手机的通讯录支持中文的感觉。

能说说你为啥关注 matrix 吗?我理解:

matrix 在去中心化情况下,要给聊天进行签名和验证,所以相同的功能实现的就比较鬼畜(我也干过类似勾当)。
mattermost 做的就是私有化部署的聊天,比较容易实现。

但用户好像不是很 care ,所以 mattermost 口碑更好
gal
2024-08-04 15:44:54 +08:00
@pieerepeng 我是深度用户,自己开发插件的,mattermost 也在服务器上,如果追求简单易用,群晖 Chat 是最好的选择。
pieerepeng
2024-08-04 16:16:11 +08:00
@gal 牛逼
YamatoRyou
2024-08-05 06:56:38 +08:00
我有冷备份的数据库 (停机后打包 /var/lib/postgresql/data), 能直接用在带 zhparaser 的 Postgres 使用么?
gal
2024-08-05 13:48:13 +08:00
@YamatoRyou 通过打包复制 data 目录的方式迁移 postgresql 数据库可能导致数据损坏,最好还是用 pg_dump 或 pg_restore ,如文章介绍的那样。
YamatoRyou
2024-08-09 17:25:40 +08:00
@gal #5 已经用 pg_dump 分别迁移了 2 个数据库, 现在已经用上了你的搜索方案. 一定程度上改善了长期困扰我的问题, 感谢.
gal
2024-08-09 17:29:16 +08:00
@YamatoRyou 很高兴能帮到你
YamatoRyou
292 天前
@gal #7
最近发现搜索存在死角, 具体表现为:
一个非加密房间中的个别特定关键词仍然无法搜索.

例文:
host 模式是容器和主机共享 1 个地址, 会导致端口资源紧张或冲突. 另一种低风险的方法是新建驱动程序为 "macvlan" 的网络, 可以避免因为乱动系统文件导致群晖失联.


"容器" 通过客户端自带的搜索功能无法被搜索到.


但那个事件中包含关键词的正文单独拿出来用测试语句却可以正常分词.
测试 SQL 语句:
SELECT * FROM ts_parse('zhparser', 'host 模式是容器和主机共享 1 个地址, 会导致端口资源紧张或冲突. 另一种低风险的方法是新建驱动程序为 "macvlan" 的网络, 可以避免因为乱动系统文件导致群晖失联.');

"容器" 在分词结果中.


我怀疑是索引不到位, 是否有可能 "在服务器不推倒重来的情况下只重建中文搜索部分的索引" 来解决问题? 如果能求方法.
gal
291 天前
@YamatoRyou 我这没有问题,不妨尝试重新索引一下。
另外 search.py 源代码有变化: https://github.com/element-hq/synapse/commits/develop/synapse/storage/databases/main/search.py
你可以去上面博文里重新下载。
YamatoRyou
291 天前
@gal #9
已经更换为文章提供的脚本 (方法为停止容器, 用该文件替换旧文件并将其映射到容器内, 最后启动容器), 但问题依旧. 我怕破坏数据库, 求一个正确重新索引的方法.
我试过的方法为只执行以下 2 行 (此时表 "event_search" 列 "chinese_vector" 都已经存在的情况下):
UPDATE event_search SET chinese_vector = to_tsvector('chinese', vector::text);
执行以上一行, 表 "event_search" 列 "chinese_vector" 中的部分记录变成了 null, 一段时间后恢复
CREATE INDEX CONCURRENTLY event_search_chinese_vector_idx ON event_search USING GIN (chinese_vector)
执行以上一行, 搜索能力看上去没什么变化.
YamatoRyou
291 天前
@gal #9
原因已经找到: 对于最新版本的 Synapse (1.119.x), search.py 的存储路径已经改变, 但重建容器使用的仍然是旧路径导致修改后的搜索脚本始终未能生效.
文章中给出的路径:
"/usr/local/lib/python3.11/site-packages/synapse/storage/databases/main/search.py"

变更后的路径:
"/usr/local/lib/python3.12/site-packages/synapse/storage/databases/main/search.py"
gal
290 天前
@YamatoRyou 是的,感觉指正,1.119.0 版升级了 python 依赖,我这边的测试结果是使用旧路径会导致容器无法启动。
顺便提醒一下, (Shared Secret Authenticator)[https://github.com/devture/matrix-synapse-shared-secret-auth]这个密码提供程序模块(主要用于桥接)的映射路径也要改成 python3.12.
YamatoRyou
130 天前
@gal #12 用了一段时间, 感觉你的方案有可以继续扩展的可能. 设想比如搞一个机器人专门针对非加密房间做这件事, 顺便还能解决消息搜索在各平台客户端上表现参差不齐的问题.
gal
130 天前
@YamatoRyou 当然可以,在机器人后面搭一个 RAG 平台,例如 fastgpt 之类的,使用 AI 模型搜索聊天消息,以及其他 agent ,玩法很多,需要折腾。

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

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

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

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

© 2021 V2EX