弹性搜索:展开文档中的数组属性

Elastic Search : Unwind an array attribute in a document

我在弹性搜索中有以下 JSON 个文档。

 Document 1
 {
  "name":"abc",
  "class": "First"
  "marks": [
      {"subject": "science", "total": 100},
      {"subject": "maths", "total": 100}   
  ]
}
 Document 2
 {
  "name":"cde",
  "class": "First"
  "marks": [
      {"subject": "science", "total": 100},
      {"subject": "maths", "total": 100}   
  ]
}

当我查询 class 1 时,我需要得到如下结果。

[
   {
      "name":"abc",
      "class": "First",
       "subject": "science", 
       "total": 100
},
{
      "name":"abc",
      "class": "First",
       "subject": "maths", 
       "total": 100
},
 {
      "name":"cde",
      "class": "First",
       "subject": "science", 
       "total": 100
},
{
      "name":"cde",
      "class": "First",
       "subject": "maths", 
       "total": 100
}
]

是否可以在elasticsearch中得到这种格式或接近这种格式的结果?我们是否需要嵌套类型来实现这一点?我试图避免处理结果并在代码中创建平面结构。弹性搜索版本为 7.9

最接近这种扁平化的方法是“劫持”script fields:

POST index_name/_search
{
  "script_fields": {
    "docs": {
      "script": {
        "source": """
          def shared = ["name":params._source.name, "class":params._source.class];
          def enriched_marks = [];
          for (def mark : params._source.marks) {
            def tmp = [:];
            tmp.putAll(shared);
            tmp.putAll(mark);
            enriched_marks.add(tmp);
          }
          
          return enriched_marks;
        """
      }
    }
  }
}

产量:

"hits" : {
  ...
  "hits" : [
    {
     ...
      "fields" : {
        "docs" : [
          {
            "name" : "abc",
            "total" : 100,
            "class" : "First",
            "subject" : "science"
          },
          {
            "name" : "abc",
            "total" : 100,
            "class" : "First",
            "subject" : "maths"
          }
        ]
      }
    },
    {
     ...
      "fields" : {
        "docs" : [
          {
            "name" : "cde",
            "total" : 100,
            "class" : "First",
            "subject" : "science"
          },
          {
            "name" : "cde",
            "total" : 100,
            "class" : "First",
            "subject" : "maths"
          }
        ]
      }
    }
  ]
}

但是您仍然需要进一步展平这些预先展平的对象。