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

2021-10-28 12:12:25 +08:00
 ospider

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

posts:

replies:

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

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

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

2085 次点击
所在节点    Elasticsearch
5 条回复
czfy
2021-10-28 12:18:15 +08:00
我不是研发但是和研发对接过类似的场景,如果错了后面研发大佬指正

一般两种方式
两张表:直接通过 post id 映射
一张表:多一个字段表明 content 是正文还是评论,再多一个字段放评论对应的 post id (正文的这个字段为空)
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
2021-10-28 14:28:43 +08:00
你这个似乎不太常见,大部分搜索应该都是不考虑回复的。如果确实两边都要搜可能要注意一下分页正确的问题
jifengg
2021-10-28 15:08:29 +08:00
如果搜索“V2ex”,正文没命中,一个文章的多条回复命中了,是只给用户展示一条还是多条?正文和评论都命中了,展示几条?这些需求要确定好才好定结构。
ospider
2021-10-28 17:23:33 +08:00
@jifengg 这也是一个问题,我希望返回的是去重后的结果

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

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

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

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

© 2021 V2EX