ElasticSearch Nested NumericRangeQuery usando el valor mínimo de la lista para comparar

Sep 25 2020

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

2 ESCoder Sep 26 2020 at 03:23

La consulta de búsqueda realiza la siguiente agregación:

  1. Agregación de términos en el idcampo
  2. Agregación mínima enlistItems.value
  3. 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
            }
          }
        }
      ]
    }
  }