elasticsearch - 弹性搜索:展开文档中的数组属性
问题描述
我在弹性搜索中有以下 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}
]
}
当我查询第 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
}
]
这是否可以在弹性搜索中以这种格式或接近这种格式获得结果?我们需要嵌套类型来实现这一点吗?我试图避免处理结果并在代码中创建平面结构。弹性搜索版本是 7.9
解决方案
最接近这种扁平化的方法是“劫持”脚本字段:
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"
}
]
}
}
]
}
但是您仍然需要将这些预展平的对象进一步展平。
推荐阅读
- javascript - 从 React 中的子组件更改 prop 后,等待从父组件更改 prop
- javascript - className 和 classList 的区别
- python - 在 pyspark 中的列表上应用逻辑运算符
- datagridview - DYNAMIC_DATA_OBJECT_GRID 应该使用什么值类型
- amazon-web-services - 如何在 Spring Cloud 功能中获取标头?
- reactjs - 如何在 React 中返回 Stencil VNode 元素?
- java - 如何在带有 twiterkit 的 android 应用程序中使用我的 twitter 帐户登录
- javascript - 如何为反应表中的每一列添加搜索按钮以进行列过滤?
- javascript - 如何在图表内和悬停时显示百分比?
- python - 在python中打开文本文件时如何解决\u202a错误?