实现 Matrix Synapse 中文搜索 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
gal
V2EX    程序员

实现 Matrix Synapse 中文搜索

  •  
  •   gal 2024-08-04 14:50:51 +08:00 1634 次点击
    这是一个创建于 440 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    14 条回复    2025-04-25 03:17:22 +08:00
    pieerepeng
        1
    pieerepeng  
       2024-08-04 15:29:15 +08:00
    支持一下。有种 08 年看如何给 android 手机的通讯录支持中文的感觉。

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

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

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

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


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


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

    "容器" 在分词结果中.


    我怀疑是索引不到位, 是否有可能 "在服务器不推倒重来的情况下只重建中文搜索部分的索引" 来解决问题? 如果能求方法.
    gal
        9
    gal  
    OP
       337 天前
    @YamatoRyou 我这没有问题,不妨尝试重新索引一下。
    另外 search.py 源代码有变化: https://github.com/element-hq/synapse/commits/develop/synapse/storage/databases/main/search.py
    你可以去上面博文里重新下载。
    YamatoRyou
        10
    YamatoRyou  
       337 天前
    @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
        11
    YamatoRyou  
       337 天前
    @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
        12
    gal  
    OP
       337 天前
    @YamatoRyou 是的,感觉指正,1.119.0 版升级了 python 依赖,我这边的测试结果是使用旧路径会导致容器无法启动。
    顺便提醒一下, (Shared Secret Authenticator)[https://github.com/devture/matrix-synapse-shared-secret-auth]这个密码提供程序模块(主要用于桥接)的映射路径也要改成 python3.12.
    YamatoRyou
        13
    YamatoRyou  
       177 天前
    @gal #12 用了一段时间, 感觉你的方案有可以继续扩展的可能. 设想比如搞一个机器人专门针对非加密房间做这件事, 顺便还能解决消息搜索在各平台客户端上表现参差不齐的问题.
    gal
        14
    gal  
    OP
       176 天前
    @YamatoRyou 当然可以,在机器人后面搭一个 RAG 平台,例如 fastgpt 之类的,使用 AI 模型搜索聊天消息,以及其他 agent ,玩法很多,需要折腾。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1410 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 16:53 PVG 00:53 LAX 09:53 JFK 12:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86