Elasticsearch -如何从用户订阅的节目中查询所有剧集?

z3yyvxxp  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(214)

我们为每个用户、节目和剧集保存一个项目。我们将所有内容保存在同一索引中。实体关系图如下所示:

┌────┐      ┌────────────┐     ┌────┐
 │User├─────<┤Subscription├>────┤Show│
 └────┘      └────────────┘     └─┬──┘
                                  │
                                  │
                                 /|\
                               ┌───────┐
                               │Episode│
                               └───────┘

这些项目看起来如下所示:
用户名:

{ id: user-1, name: one }

显示:

{ id: show-1, title: showTitle }

单集:

{ id: show-1, title: episodeTitle, showId: show-1, createdAt: today }

**我们想做一个像youtube的订阅页面,我们想列出用户订阅的所有节目的所有剧集。**如果可能的话,我们想在一个查询中实现这一点。

在PostgreSQL上,我会使用IN,并使用如下查询:
SELECT * FROM Episode WHERE show_id IN (SELECT show_id FROM Subscription WHERE user_id = 'userId')
ES是否提供了一种方法来实现这一点?我们正在考虑使用多个查询,每个订阅一个,但如果可能的话,我们希望将所有这些委托给一个单一的ElasticSearch查询。

dzhpxtsq

dzhpxtsq1#

因为Elasticsearch是面向文档的数据库,这就是为什么我设置的数据结构与传统的SQL数据库有些不同。
使用订阅作为文档:

// Subscription
{
    "id": "sub-1",
    "user": {"id":"user-1"}, //or   "userId": "user-1",
    "shows": [{
        "id": "show-1",
        "title": "showTitle",
        "episodes":[{"id":"episode-1"}, ...]
    }]
}

// GET /subscription-1/_search
{
    "query": {
        "nested": {
            "path": "user",
            "query": {
                "term": { "user.id": "user-1" },
                "score_mode": "avg"
            }
        }
    }
}

或其他示例,您也可以将其嵌套到Show文档中:

// Show
{
   "id": "show-1"
   "title": "showTitle",
   "episodes":[{"id":"episode-1"}, ...], //or episodeIds: ["episode-1", ...]
   "subscribers": [{"id":"user-1"}, ...] // or subscriberIds: ["user-1", ...]
}

// GET /shows-0001/_search
{
    "query": {
        "nested": {
            "path": "subscribers",
            "query": {
                "term": { "subscribers.id": "user-1" },
                "score_mode": "avg"
            }
        }
    }
}

我也会推荐这样的答案:https://stackoverflow.com/a/5373969/12564580

相关问题