Karşılaştırma için listeden minimum değeri kullanan ElasticSearch Nested NumericRangeQuery

Sep 25 2020

Aşağıdaki verilere sahibim:

[{
    "id": "1",
    "listItems": [
        {
            "key": "li1",
            "value": 100
        },
        {
            "key": "li2",
            "value": 5000
        }
    ]
},
{
    "id": "2",
    "listItems": [
        {
            "key": "li3",
            "value": 200
        },
        {
            "key": "li2",
            "value": 2000
        }
    ]
}]

NumericRangeQuery filtresi yapmaya çalışıyorum, böylece her belgenin listItems içindeki MIN değeri bir aralık arasında eşleşiyor. Örneğin, aralığım 150 ile 15000 arasındadır.

Bunu nasıl yazacağımı bilmemin tek yolu bir komut dosyası sorgusu kullanmaktır, ancak kod hala listenin altındaki herhangi bir değeri kaptığı için işe yaramıyor gibi görünüyor Dediğim gibi MIN'i kapmak yerine aralıkla eşleşmeye çalışmak için. İşte benim sorgum:

{
"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"
                        }
                    }
                }
            }
        ]
    }
}}

Benim görmediğim bir şeyi gören var mı?

Yanıtlar

2 ESCoder Sep 26 2020 at 03:23

Arama sorgusu aşağıdaki toplamayı gerçekleştirir:

  1. Şartlar agregasyon da üzerinde idalanın
  2. Min toplama üzerindelistItems.value
  3. Mevcut paketin üst çoklu paket toplamasında tutulup tutulmayacağını belirleyen bir komut dosyası yürüten bir üst ardışık düzen toplama olan Paket Seçici toplama.

Dizin eşleme, dizin verileri, arama sorgusu ve arama sonucu ile çalışan bir örnek ekleme

Dizin Eşleme:

{
  "mappings": {
    "properties": {
      "listItems": {
        "type": "nested" 
      },
      "id":{
        "type":"text",
        "fielddata":"true"
      }
    }
  }
}

Dizin Verileri:

{
    "id" : "1",
    "listItems" : 
        [
            {
                "key" : "li1",
                "value" : 100
            },
            {
                "key" : "li2",
                "value" : 5000
            }
        ]
}
{
    "id" : "2",
    "listItems" : 
        [
            {
                "key" : "li3",
                "value" : 200
            },
            {
                "key" : "li2",
                "value" : 2000
            }
        ]
}

Arama Sorgusu:

{
    "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"
                    }
                }
            }
        }
    }
}

Arama sonuçları:

"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
            }
          }
        }
      ]
    }
  }