Я храню в ElasticRearch серию каналов.Каждый канал имеет актера, публикующего такой канал и дату публикации.В другом месте я сохраняю взвешенное значение для каждого участника следующим образом:
weights: [{'id': 'mark', 'weight': 1}, {'id': 'jane', 'weight': 3}]
Мне нужно запросить каналы, сгруппированные по дате, но упорядоченные по таким весам.Я попытался сделать функцию сортировки, используя безболезненно, но я застрял в определении весов:
{
"size": 0,
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"actor.id": "mark"
}
},
{
"range": {
"published": {"gte": "2017-09-30T15:37:21.530483"}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"actor.id": "jane"
}
},
{
"range": {
"published": {"gte": "2017-09-30T15:37:21.530483"}
}
}
]
}
}
]
}
},
"aggs": {
"dates": {
"terms": {
"field": "published_date",
},
"aggs": {
"top_verbs_hits": {
"top_hits": {
"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "def weights = [{'id': 'mark', 'weight': 1}, {'id': 'jane', 'weight': 3}]; def weight = 0; for (int i = 0; i < weights.length; ++i) { if (weights[i].id == doc.actor.id) return weights[i].weight; } return weight;"
},
"order": "asc"
}
},
"_source": {
"includes": ["published", "actor", "object", "target", "extra"]
},
"size": 100
}
}
}
}
},
"sort": [
{
"published": {
"order": "desc"
}
}
],
}
Для ясности безболезненная функция выглядит следующим образом:
def weights = [{'id': 'mark', 'weight': 1}, {'id': 'jane', 'weight': 3}];
def weight = 0;
for (int i = 0; i < weights.length; ++i)
{
if (weights[i].id == doc.actor.id)
return weights[i].weight;
}
return weight;
Упругие дать мнеошибка компиляции рядом с определением массива.Я предполагаю, что я не могу определить список / массив объектов JSON:
compile error","script_stack":["def weights = [{'id': 'mark', 'weight ..."," ^---- HERE"]....
Есть ли способ сделать это с помощью сценария сортировки или без него?