gpt4 book ai didi

elasticsearch - Elasticsearch多索引查询

转载 作者:行者123 更新时间:2023-12-03 01:11:33 28 4
gpt4 key购买 nike

我有一个用于存储类(class)详细信息的以下索引(为简洁起见,我已将某些属性删节了):

{
"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_per_user是用户可以完成类(class)的次数。允许用户多次通过一门类(class),但最多不能超过max_per_user
我想跟踪用户与类(class)的互动。我创建了以下索引来跟踪交互事件。 event_type_id代表互动类型
{
"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_count是用户完成整个类(class)的次数
现在,当我对类(class)索引进行搜索时,我还希望能够传递user_id并仅获取那些给定用户的current_count小于类(class)的max_per_user的类(class)
我对类(class)索引的搜索查询是这样的(为简洁起见,一些过滤器被删节了)。当用户搜索类(class)时会执行此查询,因此基本上在执行此查询时我将拥有user_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
}
}
]
}
}
}
我不确定如何构造搜索查询,以便能够过滤出针对给定user_id实现max_per_user的类(class)。

最佳答案

如果我正确理解了该问题,则希望找到不超过max_per_user限制的类(class)。我的回答是基于相同的:
考虑您当前的架构方式来找到所需的内容:

  • 对于给定的user_id,找到所有course_id及其对应的完成计数
  • 使用#1中获取的数据找出不超过max_per_user限制的类(class)。

  • 现在出现问题:
  • 在关系数据库中,可以使用表联接解决此类用例并检查
  • flex 搜索不支持联接,因此无法在此处完成。

  • 当前架构的解决方案较差:
  • 对于每门类(class),请检查其是否适用。对于n个类(class),对E.S的查询数量将与N成正比。

  • 当前架构的解决方案:
  • 在-user-course-completion索引中(您提到的第二个索引),还跟踪max_per_user并使用如下所示的简单查询来获取所需的类(class)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
    }
    }
    }
  • 关于elasticsearch - Elasticsearch多索引查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64121405/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com