이를 위해 집계가 필요하지 않습니다.
다음은 정렬 기준입니다.
- 거리 ASC (회사. 위치)
- 등급 DESC (company.rating_value)
- Soonest Future Availability 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
각각의 손자 (대한 가용성 )입니다 1 / number-of-hours-until-available
(그래서 우리가 사용할 수있는 최대 상호 직원 당 가능하고, 때까지 시간을 최대 상호 (LY?) 회사 당 가능 직원).
모두 합쳐서 회사를 계속 쿼리 하지만 company> employee> availabilty_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" }
}
}