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_datepropertyValue:true

2) 必须查询 一个等于表示嵌套文档与 查询日期 property:true 的最小距离。使用 linear_decay

3)should-clause 中找到所有包含 effective-date <= query_datepropertyValue:false

4)2) 给这个查询一个等于最小距离的分数来自查询日期 property:false

的嵌套文档的数量

5) 减去 2) 和 4) 如果结果为负,则表示 max(effective_date) <= asked_datepropertyValue: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
}