Постановка проблемы У меня есть вложенные документы, где я должен применить некоторые фильтры к вложенному документу и хочу отсортировать родительские документы по количеству вложенных документов, удовлетворяющих этому фильтру.
// Пример задачи
Нам нужно было применить фильтр и отсортировать в одном запросе, в частности, в следующем порядке:
- Filter => Блоги с комментариями из города 'Пуна '
- Сортировка => на основе количества комментариев, поступающих из города Пуна
Образец данных:
[{
"title": "Investment secrets",
"body": "What they don't tell you ...",
"tags": [ "shares", "equities" ],
"comments": [
{
"id": 12313,
"city": "Pune",
"name": "Mary Brown 1",
"comment": "Lies, lies, lies ",
"date": "2018-10-18"
},
{
"id": 12314,
"city": "Pune",
"name": "Mary Brown 1",
"comment": "Lies, lies, lies ",
"date": "2018-10-20"
}
]
},
{
"title": "Investment secrets",
"body": "What they don't tell you ...",
"tags": [ "shares", "equities" ],
"comments": [
{
"id": 12315,
"city": "Pune",
"name": "Mary Brown ",
"comment": "Lies, lies, lies ",
"date": "2018-10-18"
},
{
"id": 12316,
"city": "Bangalore",
"name": "Mary Brown ",
"comment": "Lies, lies, lies ",
"date": "2018-10-20"
}
]
}]
Решения, пробованные к настоящему моменту:
с использованием поля сценариев
{
"query":{
"nested":{
"path":"comments",
"inner_hits":{
},
"query":{
"term":{
"comments.city":{
"value":"Pune"
}
}
}
}
},
"sort":{
"_script":{
"script":"params._source.inner_hits.comments.hits.total",
"type":"number",
"order":"desc"
}
}}
Проблема с этим решением => inner_hits здесь не доступен
Мы также попробовали Score_mode: Sum, но, похоже, он работает более корректно с полями, уже имеющими числовые значения, иначе это будет отсортировано, но мы не можем определить его релевантность.И наша текущая структура данных не имеет никакого числового поля, кроме ID. (Поэтому здесь явно не нужно использовать Score_mode в качестве суммы).
{<br>
"query":{<br>
"nested":{<br>
"path":"comments",
"query":{<br>
"bool":{<br>
"must":[<br>
{<br>
"term":{<br>
"comments.numericField":{<br>
"value":"numericValue"
}
}
}
]
}
},
"score_mode":"sum",
"inner_hits":{ </p>
<pre><code> }
}
}
}
мы думали об использовании пользовательского function_score, но не пробовали его, поскольку было бы сложно определить приоритет сортировки при наличии большого количества фильтров.
Итак, мы думали о решении этой проблемы, не используя счет.