gpt4 book ai didi

elasticsearch - ElasticSearch-获取文档,其中字段的值为x并且类型的最大日期小于y日期

转载 作者:行者123 更新时间:2023-12-02 22:24:32 25 4
gpt4 key购买 nike

我有以下文件(从sql导入):

{
user : {
id:1,
efectiveDateFields : {
items : [
{
"effectiveFrom": "2014-06-10T00:00:00",
"propertyValue": true
},
{
"effectiveFrom": "2015-03-15T00:00:00",
"propertyValue": false
}
]
}
}
},
{
user : {
id:2,
efectiveDateFields : {
items : [
{
"effectiveFrom": "2014-06-13T00:00:00",
"propertyValue": false
},
{
"effectiveFrom": "2015-03-16T00:00:00",
"propertyValue": true
}
]
}
}
}

我想得到一个列表,其中MAX(user.efectiveDateFields.items.effectiveFrom)<=今天的日期和propertyValue:false。如何使用Elastic做到这一点?

这是我到目前为止所拥有的:
{
"bool": {
"must": [
{
"range": {
"user.items.effectiveFrom": {
"gte": "2013-08-28"
}
}
},
{
"term": {
"user.items.propertyValue": false
}
}
]
}
}

但这带来了所有文档,因为我没有检查最大日期。谁能帮我?

编辑

业务问题:

因此,对于业务问题,请按部分进行划分:我有一家公司的员工列表。每个员工都有正常值(未注明日期),例如ID,姓名,出生日期。
现在,对于每个员工,我已经获得了与公司相关的数据。对于这种情况,让我们在 bool(boolean) 字段中说明该雇员是否为董事,这可以随着时间的推移而变化,例如晋升。因此,示例数据将是
Id: 1,
Name : Alberto Soares,
BirthDate : 1990-01-01,
isDirector {
items:
[
{
effectiveDate : 2010-05-16,
propertyValue : false // I'm a simple employee
},
{
effectiveDate : 2011-09-22,
propertyValue : true // Because I've worked very hard, I'm now a director
}
]
}

因此,现在我有了这些数据(一些更多的记录),并且我想知道在任何给定日期,谁是公司的董事,比如说2010-12-20。在sql中,我像OP那样做,但是我完全不知道如何做Elastic。

在我的映射中(我正在使用嵌套),我已经嵌套了Items(带有propertyValue的有效日期)。

最佳答案

哇,这是一个有趣的问题。
简而言之,我在下文中建议的是纯“brain-fcuk”。
下面的不可读查询大量使用了function_score和min score。

查询的结构是为给定日期实现以下功能:

1) 子句查找具有至少一个带有effective-date <= query_datepropertyValue:true的项目文档的所有文档。

2)赋予必须向查询一个分数,该分数等于一个值,该值表示使用property:true从查询日期到嵌套文档的最小距离。利用linear_decay

3)应该包含的子句中,找到所有具有effective-date <= query_datepropertyValue:false的文档。

4)相同2)给此查询一个分数,该分数等于使用property:false从查询日期到嵌套文档的最小距离

5)减去2)和4),如果结果为负,则表示max(有效日期)<= ask_date具有propertyValue:false使用 min-score 筛选分数为负的文档。

1)映射项目为嵌套类型

put user/user/_mappings
{
"properties": {
"id": {
"type": "integer"
},
"efectiveDateFields": {
"type": "object",
"properties": {
"items": {
"type": "nested"
}
}
}
}
}

2)查询示例文件
  • User-1-担任总监,直到2015年10月22日
  • User-2-自2015年10月22日起担任有效总监
  • User-3-自2015年10月15日起担任有效总监
  • User-4-伟大的工程师而不是导演
     put user/user/1
    {
    "id": 1,
    "isDirector" : {
    "items" : [
    {
    "effectiveFrom": "2014-06-10T00:00:00",
    "propertyValue": false
    },
    {
    "effectiveFrom": "2015-03-15T00:00:00",
    "propertyValue": true
    },
    {
    "effectiveFrom": "2015-10-22T00:00:00",
    "propertyValue": false
    }
    ]
    }
    }
    put user/user/2
    {
    "id":2,
    "isDirector" : {
    "items" : [
    {
    "effectiveFrom": "2014-06-13T00:00:00",
    "propertyValue": false
    },
    {
    "effectiveFrom": "2015-10-22T00:00:00",
    "propertyValue": true
    }
    ]
    }
    }

    put user/user/3
    {
    "id": 3,
    "isDirector" : {
    "items" : [

    {
    "effectiveFrom": "2015-03-15T00:00:00",
    "propertyValue": true
    }
    ]
    }
    }


    put user/user/4
    {
    "id": 4,
    "isDirector": {
    "items": [
    {
    "effectiveFrom": "2011-10-23T00:00:00",
    "propertyValue": false
    }
    ]
    }
    }

  • 3)查询示例(查询日期为2015-10-23):应返回2个匹配:2,3,
        post user/user/_search
    {
    "query": {
    "bool": {
    "disable_coord": true,
    "must": [
    {
    "nested": {
    "path": "isDirector.items",
    "query": {
    "function_score": {
    "functions": [
    {
    "linear": {
    "isDirector.items.effectiveFrom": {
    "origin": "2015-10-23",
    "scale": "36500d"
    }
    }
    }
    ],
    "score_mode": "multiply",
    "boost_mode": "replace",
    "query": {
    "bool": {
    "must": [
    {
    "range": {
    "isDirector.items.effectiveFrom": {
    "lte": "2015-10-23"
    }
    }
    },
    {
    "term": {
    "isDirector.items.propertyValue": true
    }
    }
    ]
    }
    }
    }
    },
    "score_mode": "max"
    }
    }
    ],
    "should": [
    {
    "function_score": {
    "functions": [
    {
    "weight": -1
    }
    ],
    "query": {
    "bool": {
    "must": [
    {
    "nested": {
    "path": "isDirector.items",
    "query": {
    "function_score": {
    "functions": [
    {
    "linear": {
    "isDirector.items.effectiveFrom": {
    "origin": "2015-10-23",
    "scale": "36500d"
    }
    }
    }
    ],
    "score_mode": "multiply",
    "boost_mode": "replace",
    "query": {
    "bool": {
    "must": [
    {
    "range": {
    "isDirector.items.effectiveFrom": {
    "lte": "2015-10-23"
    }
    }
    },
    {
    "term": {
    "isDirector.items.propertyValue": false
    }
    }
    ]
    }
    }
    }
    },
    "score_mode": "max"
    }
    }
    ]
    }
    }
    }
    }
    ]
    }
    },
    "min_score": 0
    }

    关于elasticsearch - ElasticSearch-获取文档,其中字段的值为x并且类型的最大日期小于y日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264651/

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