ElasticSearch - 获取字段值为 x 且类型的最大日期小于 y 日期的文档
ElasticSearch - Get the documents where the value of a field is x and the max date of the type is lower then y date
我有以下文件(从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) <= 今天的日期和属性值:false。我如何使用 Elastic 做到这一点?
这是我目前所拥有的:
{
"bool": {
"must": [
{
"range": {
"user.items.effectiveFrom": {
"gte": "2013-08-28"
}
}
},
{
"term": {
"user.items.propertyValue": false
}
}
]
}
}
但是它带来了所有文件,因为我没有检查最大日期。谁能帮帮我?
编辑
业务问题:
所以对于业务问题,让我们按部分划分:我有一个公司的员工名单。每个员工都有正常值(未注明日期),例如 Id、姓名、出生日期。
现在,对于每个员工,我都有与公司相关的数据,这些数据已过时。对于这种情况,让我们有一个 bool 字段,说明该员工是否是主管,这会随着时间的推移而改变,比如晋升。所以示例数据是
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。
在我的映射中(我正在使用嵌套)我已经嵌套了项目(effectiveDate 和 propertyValue)。
哇,这是一个有趣的问题。
简而言之,我在下面提出的建议是纯粹的 "brain-fcuk"。
下面不可读的查询大量使用了 function_score 和最小分数。
查询的结构是针对给定的 Date 实现以下结果:
1) must-clause 查找至少有一个项目文档的所有文档effective-date <= query_date
和 propertyValue:true
。
2) 给 必须查询 一个等于表示嵌套文档与 查询日期 和 property:true
的最小距离。使用 linear_decay
3) 在 should-clause 中找到所有包含 effective-date <= query_date
和 propertyValue:false
。
4) 与 2) 给这个查询一个等于最小距离的分数来自查询日期 property:false
的嵌套文档的数量
5) 减去 2) 和 4) 如果结果为负,则表示 max(effective_date) <= asked_date 有 propertyValue:false 使用 min-score
过滤负分数的文档。
1) 将项目映射为嵌套类型
put user/user/_mappings
{
"properties": {
"id": {
"type": "integer"
},
"efectiveDateFields": {
"type": "object",
"properties": {
"items": {
"type": "nested"
}
}
}
}
}
2) 查询的示例文档
- 用户 1 - 在 2015 年 10 月 22 日之前担任董事
- 用户 2 - 自 2015 年 10 月 22 日起担任有效董事
- 用户 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):应该 return 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
}
我有以下文件(从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) <= 今天的日期和属性值:false。我如何使用 Elastic 做到这一点?
这是我目前所拥有的:
{
"bool": {
"must": [
{
"range": {
"user.items.effectiveFrom": {
"gte": "2013-08-28"
}
}
},
{
"term": {
"user.items.propertyValue": false
}
}
]
}
}
但是它带来了所有文件,因为我没有检查最大日期。谁能帮帮我?
编辑
业务问题:
所以对于业务问题,让我们按部分划分:我有一个公司的员工名单。每个员工都有正常值(未注明日期),例如 Id、姓名、出生日期。 现在,对于每个员工,我都有与公司相关的数据,这些数据已过时。对于这种情况,让我们有一个 bool 字段,说明该员工是否是主管,这会随着时间的推移而改变,比如晋升。所以示例数据是
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。
在我的映射中(我正在使用嵌套)我已经嵌套了项目(effectiveDate 和 propertyValue)。
哇,这是一个有趣的问题。 简而言之,我在下面提出的建议是纯粹的 "brain-fcuk"。 下面不可读的查询大量使用了 function_score 和最小分数。
查询的结构是针对给定的 Date 实现以下结果:
1) must-clause 查找至少有一个项目文档的所有文档effective-date <= query_date
和 propertyValue:true
。
2) 给 必须查询 一个等于表示嵌套文档与 查询日期 和 property:true
的最小距离。使用 linear_decay
3) 在 should-clause 中找到所有包含 effective-date <= query_date
和 propertyValue:false
。
4) 与 2) 给这个查询一个等于最小距离的分数来自查询日期 property:false
5) 减去 2) 和 4) 如果结果为负,则表示 max(effective_date) <= asked_date 有 propertyValue:false 使用 min-score
过滤负分数的文档。
1) 将项目映射为嵌套类型
put user/user/_mappings
{
"properties": {
"id": {
"type": "integer"
},
"efectiveDateFields": {
"type": "object",
"properties": {
"items": {
"type": "nested"
}
}
}
}
}
2) 查询的示例文档
- 用户 1 - 在 2015 年 10 月 22 日之前担任董事
- 用户 2 - 自 2015 年 10 月 22 日起担任有效董事
- 用户 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):应该 return 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
}