我有以下数据:

[{
    "id": "1",
    "listItems": [
        {
            "key": "li1",
            "value": 100
        },
        {
            "key": "li2",
            "value": 5000
        }
    ]
},
{
    "id": "2",
    "listItems": [
        {
            "key": "li3",
            "value": 200
        },
        {
            "key": "li2",
            "value": 2000
        }
    ]
}]
我正在尝试做一个NumericRangeQuery过滤器,以便每个文档的listItems中的MIN值在一个范围之间匹配。举例来说,我的范围是150到15000。
我知道如何编写此代码的唯一方法是使用脚本查询,但是它似乎无法正常工作,因为代码似乎仍会在listItems下获取任何值以尝试与范围匹配,而不是像我告诉的那样获取MIN它来。这是我的查询:
{
"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"
                        }
                    }
                }
            }
        ]
    }
}}
有人看到我没看到的东西吗?

最佳答案

搜索查询执行以下聚合:
id字段上的

  • Terms aggregation
  • 上的
  • Min aggregation
  • Bucket Selector aggregation是父管道聚合,执行一个脚本,该脚本确定当前存储桶是否将保留在父多存储桶聚合中。

  • 添加带有索引映射,索引数据,搜索查询和搜索结果的工作示例
    索引映射:
    {
      "mappings": {
        "properties": {
          "listItems": {
            "type": "nested"
          },
          "id":{
            "type":"text",
            "fielddata":"true"
          }
        }
      }
    }
    
    索引数据:
    {
        "id" : "1",
        "listItems" :
            [
                {
                    "key" : "li1",
                    "value" : 100
                },
                {
                    "key" : "li2",
                    "value" : 5000
                }
            ]
    }
    {
        "id" : "2",
        "listItems" :
            [
                {
                    "key" : "li3",
                    "value" : 200
                },
                {
                    "key" : "li2",
                    "value" : 2000
                }
            ]
    }
    
    搜索查询:
    {
        "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"
                        }
                    }
                }
            }
        }
    }
    
    搜索结果:
    "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
                }
              }
            }
          ]
        }
      }
    

    09-13 05:33