Я пытаюсь выполнить запрос RANGE для вложенного документа, используя ES 7.7 Java API. Я заметил, что он не фильтрует данные, как ожидалось. Когда я помещаю операторы отладки в фактический запрос, выполняемый ES, я не могу получить соответствующие результаты, в основном для раздела «to» запроса диапазона. Я заметил, что GT или GTE отлично работают через LT, а LTE также не работает должным образом.
Ниже приведен простой код Java для этого запроса диапазона. Обратите внимание, что вес во вложенном документе определяется как float, например ""weight": {"type": "float"},"
.
query.must(QueryBuilders.nestedQuery(fields[0], QueryBuilders.rangeQuery(c.getField()).from(c.getValues().get(0)).to(c.getValues().get(1)),ScoreMode.None).innerHit(innerHitBuilder));
Ниже приведен пример кода API Java для LT.
query.must(QueryBuilders.nestedQuery(fields[0], QueryBuilders.rangeQuery(c.getField()).lt(c.getValue()), ScoreMode.None).innerHit(innerHitBuilder));
Ниже запрос, который ES фактически выполняет для указанного выше оператора RANGE query statement.
{
"from":0,
"size":50,
"query":{
"bool":{
"must":[
{
"match_phrase":{
"fundsponsor":{
"query":"vanguard group inc",
"slop":0,
"zero_terms_query":"NONE",
"boost":1.0
}
}
},
{
"nested":{
"query":{
"match_phrase":{
"holdings.componentticker":{
"query":"baba",
"slop":0,
"zero_terms_query":"NONE",
"boost":1.0
}
}
},
"path":"holdings",
"ignore_unmapped":false,
"score_mode":"none",
"boost":1.0,
"inner_hits":{
"name":"holdings.componenttickerbaba",
"ignore_unmapped":false,
"from":0,
"size":100,
"version":false,
"seq_no_primary_term":false,
"explain":false,
"track_scores":false
}
}
},
{
"nested":{
"query":{
"range":{
"holdings.weight":{
"from":1.0,
"to":2.0,
"include_lower":true,
"include_upper":true,
"boost":1.0
}
}
},
"path":"holdings",
"ignore_unmapped":false,
"score_mode":"none",
"boost":1.0,
"inner_hits":{
"name":"holdings.weightnull",
"ignore_unmapped":false,
"from":0,
"size":100,
"version":false,
"seq_no_primary_term":false,
"explain":false,
"track_scores":false
}
}
}
],
"adjust_pure_negative":true,
"boost":1.0
}
},
"_source":{
"includes":[
"fundsymbol",
"fundsponsor",
"fundname",
"componentcount",
"holdings.componentticker",
"holdings.weight"
],
"excludes":[
]
}
}
Обратите внимание на приведенный ниже раздел, который является виновником. Все остальное работает как положено. Как я уже упоминал выше, "from" работает должным образом и конвертируется в GTE, как и ожидалось, но "to" не работает, как и "LT" или "LTE" по какой-то странной причине.
"nested":{
"query":{
"range":{
"holdings.weight":{
"from":1.0,
"to":2.0,
"include_lower":true,
"include_upper":true,
"boost":1.0
}
}
},