在 SQL 数据库中数据是这样存储的:
posts:
replies:
评论会随着时间而增多。而且有的帖子会有上万条评论。
我希望搜索的时候总是按照 post 为单位来返回结果。如果 post 没有命中,但是评论中命中了,那么返回这个 post 和对应的 reply 。
如何设计 ES 的 mapping 才能实现同时检索 post 和 reply ,但是总是返回对应的 post 呢?
1
czfy 2021-10-28 12:18:15 +08:00
我不是研发但是和研发对接过类似的场景,如果错了后面研发大佬指正
一般两种方式 两张表:直接通过 post id 映射 一张表:多一个字段表明 content 是正文还是评论,再多一个字段放评论对应的 post id (正文的这个字段为空) |
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 |
3
matrix1010 2021-10-28 14:28:43 +08:00 via iPhone
你这个似乎不太常见,大部分搜索应该都是不考虑回复的。如果确实两边都要搜可能要注意一下分页正确的问题
|
4
jifengg 2021-10-28 15:08:29 +08:00
如果搜索“V2ex”,正文没命中,一个文章的多条回复命中了,是只给用户展示一条还是多条?正文和评论都命中了,展示几条?这些需求要确定好才好定结构。
|