ElasticSearch Nested NumericRangeQuery usando el valor mínimo de la lista para comparar
Tengo los siguientes datos:
[{
"id": "1",
"listItems": [
{
"key": "li1",
"value": 100
},
{
"key": "li2",
"value": 5000
}
]
},
{
"id": "2",
"listItems": [
{
"key": "li3",
"value": 200
},
{
"key": "li2",
"value": 2000
}
]
}]
Estoy tratando de hacer un filtro NumericRangeQuery para que el valor MIN en los elementos de la lista de cada documento coincida entre un rango. Entonces, por ejemplo, mi rango es de 150 a 15000.
La única forma en que sé cómo escribir esto es usando una consulta de script, pero no parece funcionar ya que el código aún parece tomar cualquier valor debajo de los elementos de la lista para intentar coincidir con el rango en lugar de tomar el MIN como dije a. Aquí está mi consulta:
{
"track_total_hits": true,
"from": 0,
"min_score": 0.0,
"query": {
"bool": {
"must": [
{
"nested": {
"path": "listItems",
"query": {
"script": {
"script": "double minVal = 0; minVal = doc['listItems.value'][0]; for (wp in doc['listItems.value']) {if (wp < minVal) { minVal = wp;}} return minVal >= 150 && minVal <= 15000"
}
}
}
}
]
}
}}
¿Alguien ve algo que yo no?
Respuestas
La consulta de búsqueda realiza la siguiente agregación:
- Agregación de términos en el
idcampo - Agregación mínima en
listItems.value - Agregación del selector de cubos que es una agregación de canalización principal que ejecuta un script que determina si el depósito actual se retendrá en la agregación de varios depósitos principal.
Agregar un ejemplo de trabajo con mapeo de índice, datos de índice, consulta de búsqueda y resultado de búsqueda
Mapeo de índices:
{
"mappings": {
"properties": {
"listItems": {
"type": "nested"
},
"id":{
"type":"text",
"fielddata":"true"
}
}
}
}
Datos de índice:
{
"id" : "1",
"listItems" :
[
{
"key" : "li1",
"value" : 100
},
{
"key" : "li2",
"value" : 5000
}
]
}
{
"id" : "2",
"listItems" :
[
{
"key" : "li3",
"value" : 200
},
{
"key" : "li2",
"value" : 2000
}
]
}
Consulta de busqueda:
{
"size": 0,
"aggs": {
"id_terms": {
"terms": {
"field": "id"
},
"aggs": {
"nested_entries": {
"nested": {
"path": "listItems"
},
"aggs": {
"min_position": {
"min": {
"field": "listItems.value"
}
}
}
},
"value_range": {
"bucket_selector": {
"buckets_path": {
"totalValues": "nested_entries>min_position"
},
"script": "params.totalValues >= 150 && params.totalValues < 15000"
}
}
}
}
}
}
Resultado de búsqueda:
"aggregations": {
"id_terms": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "2",
"doc_count": 1,
"nested_entries": {
"doc_count": 2,
"min_position": {
"value": 200.0
}
}
}
]
}
}