您不需要进行聚合:
这些是排序标准:
- 距离ASC(公司位置)
- 评分DESC(company.rating_value)
- 不久的将来的可用性ASC(company.employee.availability.start)
如果忽略#3,则可以运行相对简单的公司查询,如下所示:
GET /companies/company/_search
{
"query": { "match_all" : {} },
"sort": {
"_script": {
"params": {
"lat": 51.5186,
"lon": -0.1347
},
"lang": "groovy",
"type": "number",
"order": "asc",
"script": "doc['location'].distanceInMiles(lat,lon)"
},
"rating_value": { "order": "desc" }
}
}
#3棘手,因为您需要向下查找每个与请求时间最接近的公司的可用性(公司>员工>可用性),并将该持续时间用作第三排序标准。
我们将function_score
在孙级使用查询,以获取请求时间与匹配中每个可用性之间的时间差_score
。(然后,我们将使用_score
作为第三排序标准)。
为了达到孙辈,我们需要在has_child
查询中使用has_child
查询。
对于每家公司,我们都希望有最快的员工(当然还有他们最接近的可用性)。Elasticsearch 2.0会为我们"score_mode": "min"
提供类似的解决方案,但就目前而言,由于我们仅限于"score_mode": "max"
让孙子_score
成为时差的倒数,因此。
"function_score": {
"filter": {
"range": {
"start": {
"gt": "2014-12-22T10:34:18+01:00"
}
}
},
"functions": [
{
"script_score": {
"lang": "groovy",
"params": {
"requested": "2014-12-22T10:34:18+01:00",
"millisPerHour": 3600000
},
"script": "1 / ((doc['availability.start'].value - new DateTime(requested).getMillis()) / millisPerHour)"
}
}
]
}
因此,现在_score
每个孙子代(Availability)将是1 / number-of-hours-until-available
(以便我们可以使用最长的互惠时间,直到每个Employee可用为止)和最大互惠(ly?)每个公司提供的员工)。
放在一起,我们继续查询公司,但使用公司>员工>可用性生成_score
用作#3排序标准:
GET /companies/company/_search
{
"query": {
"has_child" : {
"type" : "employee",
"score_mode" : "max",
"query": {
"has_child" : {
"type" : "availability",
"score_mode" : "max",
"query": {
"function_score": {
"filter": {
"range": {
"start": {
"gt": "2014-12-22T10:34:18+01:00"
}
}
},
"functions": [
{
"script_score": {
"lang": "groovy",
"params": {
"requested": "2014-12-22T10:34:18+01:00",
"millisPerHour": 3600000
},
"script": "1/((doc['availability.start'].value - new DateTime(requested).getMillis()) / millisPerHour)"
}
}
]
}
}
}
}
}
},
"sort": {
"_script": {
"params": {
"lat": 51.5186,
"lon": -0.1347
},
"lang": "groovy",
"type": "number",
"order": "asc",
"script": "doc['location'].distanceInMiles(lat,lon)"
},
"rating_value": { "order": "desc" },
"_score": { "order": "asc" }
}
}