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

如何设计正文+评论在 Elasticsearch 中的存储模式?

  •  
  •   ospider · 2021-10-28 12:12:25 +08:00 · 2098 次点击
    这是一个创建于 1120 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 SQL 数据库中数据是这样存储的:

    posts:

    • id
    • content
    • time_created
    • ...

    replies:

    • id
    • post_id
    • content
    • time_created
    • ...

    评论会随着时间而增多。而且有的帖子会有上万条评论。

    我希望搜索的时候总是按照 post 为单位来返回结果。如果 post 没有命中,但是评论中命中了,那么返回这个 post 和对应的 reply 。

    如何设计 ES 的 mapping 才能实现同时检索 post 和 reply ,但是总是返回对应的 post 呢?

    • 分两个索引
    • reply 作为 array 字段存储
    • post 和 reply 压扁到同一个字段
    • 或者更好的方法?
    5 条回复    2021-10-28 17:23:33 +08:00
    czfy
        1
    czfy  
       2021-10-28 12:18:15 +08:00
    我不是研发但是和研发对接过类似的场景,如果错了后面研发大佬指正

    一般两种方式
    两张表:直接通过 post id 映射
    一张表:多一个字段表明 content 是正文还是评论,再多一个字段放评论对应的 post id (正文的这个字段为空)
    Rache1
        2
    Rache1  
       2021-10-28 12:40:55 +08:00
    建议是

    post 和 reply 各建立索引,先搜索 reply 拿到 post_id ,然后再检索 post 的时候使用 bool 查询,分别匹配关键字和 terms 刚刚查出来的 post_id 。

    如果 reply 不多的话,可以考虑作为 post 的子字段。

    刚刚查了一下,ES 有 has_parent 和 has_child 查询,这样的话,你就需要把 post 和 replay 都放在一个索引里面 🤣

    https://www.elastic.co/guide/en/elasticsearch/reference/7.1/joining-queries.html#joining-queries
    matrix1010
        3
    matrix1010  
       2021-10-28 14:28:43 +08:00 via iPhone
    你这个似乎不太常见,大部分搜索应该都是不考虑回复的。如果确实两边都要搜可能要注意一下分页正确的问题
    jifengg
        4
    jifengg  
       2021-10-28 15:08:29 +08:00
    如果搜索“V2ex”,正文没命中,一个文章的多条回复命中了,是只给用户展示一条还是多条?正文和评论都命中了,展示几条?这些需求要确定好才好定结构。
    ospider
        5
    ospider  
    OP
       2021-10-28 17:23:33 +08:00
    @jifengg 这也是一个问题,我希望返回的是去重后的结果
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3272 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:01 · PVG 20:01 · LAX 04:01 · JFK 07:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.