elasticsearch多索引查询

oaxa6hgo  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(501)

我有一个存储课程详细信息的索引(为了简洁起见,我截断了一些属性):

{
  "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数的课程。

n53p2ov0

n53p2ov01#

如果我理解的问题是正确的,你想找到的课程,最大每用户上限是没有超过。我的答案是一样的:
考虑到您当前的模式,找到所需内容的方法是:
对于给定的用户\u id,查找所有课程\u id及其相应的完成计数
使用#1中获取的数据,找出未超过每个用户最大#限制的课程。
现在问题来了:
在关系数据库中,这种用例可以使用表连接和检查来解决
ElasticSearch不支持联接,不能在此处执行。
当前架构的解决方案不佳:
对于每门课程,检查其是否适用。对于n门课程,对e.s.的查询数将与n成正比。
具有当前架构的解决方案:
在用户课程完成索引(您提到的第二个索引)中,也可以跟踪每个用户的最大\u,并使用下面这样的简单查询来获取所需的课程ID:

{
  "size": 10,
  "query": {
    "script": {
       "script": "doc['current_usage'].value<doc['max_per_user'].value && 
       doc['u_id'].value==1" // <======= 1 is the user_id here
}
}
}

相关问题