首页 > 解决方案 > Elasticsearch - 如何过滤嵌套对象列表

问题描述

我有一个对象列表,我只需要根据他孩子的值获取对象,例如,给定下面的示例,我如何才能只检索一些孩子的年龄大于给定年龄参数的人?

hits:[
person:{
   value1: "something",
   value2: "something",
   children: [
      {age:18},
      {age:20}
   ]
}]

我尝试了一些查询上下文但没有成功:

{
  "min_score": 0.1,
  "query": {
    "function_score": {
      "functions": [
        {
          "script_score": {
            "script": {
              "source": """
              if (params["_source"]["children"][0]['age'] === params.age) {
                return 1;
              }else{
                return 0;
              """,
              "params": {
                "age": "20"
              }
            }
          }
        }
      ]
    }
  }
}

标签: elasticsearch

解决方案


您将需要一个nested数据类型映射和一个嵌套查询来配合它。

基本映射:

PUT persons
{
  "mappings": {
    "properties": {
      "person": {
        "type": "object",
        "properties": {
          "children": {
            "type": "nested"
          }
        }
      }
    }
  }
}

插入的人:

POST persons/_doc
{
  "person": {
    "value1": "something",
    "value2": "something",
    "children": [
      {
        "age": 18
      },
      {
        "age": 20
      }
    ]
  }
}

搜索确切年龄为 20 岁的儿童:

GET persons/_search
{
  "query": {
    "nested": {
      "path": "person.children",
      "query": {
        "term": {
          "person.children.age": {
            "value": 20
          }
        }
      }
    }
  }
}

您还可以使用== == 20的范围查询。gtelte


推荐阅读