Я пытаюсь отфильтровать свой запрос по количеству найденных вложенных объектов. В документации Elasti c Search упоминается, что использование сценария - дорогостоящая задача, поэтому я решил сделать это с оценкой, хотя, похоже, я тоже не могу заставить сценарий работать.
Вот мои сопоставления:
"mappings": {
"properties": {
"dates" : {
"type" : "nested",
"properties" : {
"rooms" : {
"type" : "integer"
},
"timestamp" : {
"type" : "long"
}
}
},
"doc_id" : {
"type" : "text"
},
"distance" : {
"type" : "integer"
}
...
}
}
Вот несколько примеров данных:
PUT /test/_doc/1
{
"doc_id": "1",
"distance": 1,
"dates": [
{
"rooms": 1,
"timestamp": 1
},
{
"rooms": 1,
"timestamp": 2
},
...
]
}
Я фильтрую по родительскому полю distance
, среди прочего, и фильтрация вложенных dates
по их timestamps
и rooms
. Мне нужно отфильтровать все результаты по точному количеству найденных дат гнезд.
Я пытался позаимствовать из здесь .
Это мой поисковый запрос:
GET /test/_search
{
"query" : {
"function_score": {
"min_score": 20,
"boost": 1,
"functions": [
{
"script_score": {
"script": {
"source": "if (_score > 20) { return - 1; } return _score;"
}
}
}
],
"query": {
"bool" : {
"filter": [
{ "range": { "distance": { "lt": 5 }}},
{
"nested": {
"score_mode": "sum",
"boost": 10,
"path": "dates",
"query": {
"bool": {
"filter": [
{ "range": { "dates.rooms": { "gte": 1 } } },
{ "range": { "dates.timestamp": { "lte": 2 }}},
{ "range": { "dates.timestamp": { "gte": 1 }}}
]
}
}
}
}
]
}
}
}
}
}
Это возвращает все совпадающие результаты, но все они имеют оценку 0,0 и не фильтруются по количеству найденных вложенных объектов.
Если это правильное решение, как я могу заставить это работать? Если нет, то как я могу получить скрипт для этого в рамках этого поиска?
Спасибо!