我有一个存储课程详细信息的索引(为了简洁起见,我截断了一些属性):
{
"settings": {
"index": {
"number_of_replicas": "1",
"number_of_shards": "1"
}
},
"aliases": {
"course": {
}
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"id": {
"type": "integer"
},
"max_per_user": {
"type": "integer"
}
}
}
}
这里的max\ u per\ u user是用户可以完成课程的次数。对于我要跟踪用户与课程交互的课程,允许用户多次通过课程,但不能超过每个用户的最大\u。我创建了以下索引来跟踪交互事件。事件类型标识表示一种交互类型
{
"settings": {
"index": {
"number_of_replicas": "1",
"number_of_shards": "1"
}
},
"aliases": {
"course_events": {
}
},
"mappings": {
"properties": {
"user_progress": {
"dynamic": "true",
"properties": {
"current_count": {
"type": "integer"
},
"user_id": {
"type": "integer"
},
"events": {
"dynamic": "true",
"properties": {
"event_type_id": {
"type": "integer"
},
"event_timestamp": {
"type": "date",
"format": "strict_date_time"
}
}
}
}
},
"created_at": {
"type": "date",
"format": "strict_date_time"
},
"course_id": {
"type": "integer"
}
}
}
}
其中current\u count是用户完成整个课程的次数
现在,当我在课程索引上运行搜索时,我还希望能够传入用户的\u id,并且只获取那些给定用户的当前\u计数小于课程的每个用户的最大\u计数的课程
我对课程索引的搜索查询是这样的(为了简洁起见,截断了一些过滤器)。这个查询是在用户搜索课程时执行的,所以基本上在执行这个查询时,我会有一个用户id。
{
"sort": [
{
"id": "desc"
}
],
"query": {
"bool": {
"filter": [
{
"range": {
"end_date": {
"gte": "2020-09-28T12:27:55.884Z"
}
}
},
{
"range": {
"start_date": {
"lte": "2020-09-28T12:27:55.884Z"
}
}
}
],
"must": [
{
"term": {
"is_active": true
}
}
]
}
}
}
我不知道如何构造我的搜索查询,以便我能够筛选出给定用户id的每个用户的最大\u数的课程。
1条答案
按热度按时间n53p2ov01#
如果我理解的问题是正确的,你想找到的课程,最大每用户上限是没有超过。我的答案是一样的:
考虑到您当前的模式,找到所需内容的方法是:
对于给定的用户\u id,查找所有课程\u id及其相应的完成计数
使用#1中获取的数据,找出未超过每个用户最大#限制的课程。
现在问题来了:
在关系数据库中,这种用例可以使用表连接和检查来解决
ElasticSearch不支持联接,不能在此处执行。
当前架构的解决方案不佳:
对于每门课程,检查其是否适用。对于n门课程,对e.s.的查询数将与n成正比。
具有当前架构的解决方案:
在用户课程完成索引(您提到的第二个索引)中,也可以跟踪每个用户的最大\u,并使用下面这样的简单查询来获取所需的课程ID: