弹性搜索:展开文档中的数组属性
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"
}
]
}
}
]
}
但是您仍然需要进一步展平这些预先展平的对象。
我在弹性搜索中有以下 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"
}
]
}
}
]
}
但是您仍然需要进一步展平这些预先展平的对象。