Elasticsearch 嵌套文档的新增修改删除操作

本文介绍如何在Elasticsearch中定义嵌套字段,并演示了三种常见操作:复合条件查询嵌套字段、向嵌套字段添加新数据项以及根据操作类型增删嵌套数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义某个索引中关于嵌套部分的mapping如下:

      "custLabels": {
        "type": "nested",
        "properties": {
          "action": {         

                "type": "keyword"
          },
          "labelName": {
            "type": "keyword"
          },
          "labelValue": {
            "type": "keyword"
          }
        }
      },

@Field(type= FieldType.Nested)

private List<ElaCustLabel> custLabels;

1. 嵌套查询 每个返回结果中custLabels 同时满足这三个条件:

POST /test_summary/_search

{
    "query": {
        "bool": {
            "must": [
                {
                    "nested": {
                        "path": "custLabels",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "match": {
                                            "custLabels.labelValue": "0025"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                {
                    "nested": {
                        "path": "custLabels",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "match": {
                                            "custLabels.labelValue": "0030"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                {
                    "nested": {
                        "path": "custLabels",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "match": {
                                            "custLabels.labelValue": "0002"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}

2. 修改指定索引中某个文档的嵌套数据--新增一个数据项

POST /test_summary/_doc/Rhm6hYEBNXXwNUBZ_ZwM/_update

{
    "script": {
        "source": """if(ctx._source.containsKey('custLabels')){

def targets = ctx._source.custLabels.findAll(custLabel -> custLabel.labelValue == params.custLabels.labelValue);if(targets.size() == 0) {ctx._source.custLabels.add(params.custLabels)\n\n}\n\n}else{\n\nctx._source.custLabels=[params.custLabels];}""",
        "lang": "painless",
        "params": {
            "custLabels": {
                "labelValue": "0024",
                "labelName": "老年"
            }
        }
    }
}

3.修改指定索引中某个文档的嵌套数据--根据操作类型新增或者删除

POST /test_summary/_doc/Rhm6hYEBNXXwNUBZ_ZwM/_update

{

"script": {

"source": """

for(int i=0;i<ctx._source.custLabels.length;i++){

for(int j= 0; j<params.custLabels.length; j++ ){

if(ctx._source.custLabels[i].labelValue == params.custLabels[j].labelValue && params.custLabels[j].action == 'DELETE'){

ctx._source.custLabels.remove(i);

break;

}

}

}

for(int n= 0; n<params.custLabels.length; n++ ){

int addFlag = 1;

for(int k=0;k<ctx._source.custLabels.length;k++){

if(ctx._source.custLabels[k].labelValue == params.custLabels[n].labelValue && params.custLabels[n].action == 'ADD'){

addFlag = 0;

break;

}

}

if(addFlag == 1 && params.custLabels[n].action == 'ADD'){

ctx._source.custLabels.add(params.custLabels[n]);

}

}

""",

"lang": "painless",

"params": {

"custLabels": [{"labelValue":"0001","labelName":"已用信","action":"DELETE"},

{"labelValue":"0024","labelName":"老年","action":"ADD"},

{"labelValue":"0029","labelName":"贷款","action":"ADD"}

]

}

}

}

<think>嗯,用户问的是关于Elasticsearch索引新增字段时如何设计测试用例。首先,我需要理解用户的需求。他们可能是在开发或者维护一个使用Elasticsearch的系统,需要添加新字段,但不确定如何全面测试这个改动。这时候,测试用例的设计就显得很重要了,确保新增字段不会影响现有功能,同时满足新的需求。 接下来,我应该考虑用户可能的身份。可能是测试工程师、开发人员或者DevOps。不同角色关注点不同,但测试用例的设计基本点应该是相通的。用户可能希望了解从哪些方面入手,覆盖哪些场景,有没有常见的陷阱需要避免。 然后,我需要回忆Elasticsearch新增字段的相关知识。比如,动态映射和显式映射的区别,字段的数据类型,是否允许空值,索引和搜索的影响,性能问题,版本兼容性,数据迁移等等。这些都是设计测试用例时需要考虑的方面。 用户可能没有提到的深层需求是,他们可能担心新增字段后对现有系统的稳定性影响,或者如何验证新字段的功能是否符合预期。比如,新字段是否被正确索引,查询效率如何,是否影响现有查询的性能,数据导入导出是否正常等。 接下来,我需要组织测试用例的结构。通常可以从功能测试、性能测试、兼容性测试、异常测试、数据迁移测试等方面展开。每个部分下再细分具体场景,比如功能测试包括字段类型验证、动态映射、显式映射、空值处理、默认值、更新已有文档等。 还要考虑边界情况,比如字段长度、特殊字符、大数据量下的表现。性能方面,需要测试索引速度、查询性能、集群负载等。异常情况比如字段名重复、非法数据类型、映射冲突等。 另外,用户可能关心的是如何实际操作,是否需要使用特定的工具或命令来验证,比如使用Elasticsearch的REST API进行测试,或者借助Kibana进行可视化检查。可能需要提到一些具体的例子,比如使用`_mapping` API检查映射,或者使用`_search` API验证查询结果。 最后,需要确保测试用例全面,覆盖所有可能的场景,并且给出一些实际例子,帮助用户更好地理解和应用。同时,提醒用户注意版本差异,比如不同Elasticsearch版本对字段处理的差异,以及升级时的注意事项。</think>以下是Elasticsearch索引新增字段的测试用例设计指南(按优先级分层): 一、基础功能验证 1. 字段类型校验 - 验证新增字段支持的数据类型(text/keyword/date/nested等) - 测试边界值(如date类型支持的最小/最大时间戳) - 特殊字符处理(如包含`.`的字段名需验证转义处理) 2. 动态映射测试 ```json // 示例:测试自动类型推断 POST test_index/_doc/1 { "new_field": "2023-01-01" // 应识别为date类型 } ``` 3. 显式映射测试 ```json PUT test_index/_mapping { "properties": { "new_field": { "type": "keyword", "ignore_above": 256 } } } // 验证映射是否生效 GET test_index/_mapping ``` 二、数据操作场景 1. 文档CRUD测试 - 创建含新字段的文档(单条&批量) - 更新已有文档添加新字段 - 验证未包含新字段的文档查询结果 2. 空值处理 - 测试null_value配置有效性 - 验证空数组、空字符串等特殊值处理 三、查询/聚合测试 1. 基础查询验证 ```json GET test_index/_search { "query": { "term": { "new_field.keyword": "test_value" } } } ``` 2. 聚合场景 - terms聚合验证基数准确性 - 测试date_histogram对时区处理 四、性能测试 1. 索引吞吐量基准 - 对比添加字段前后的bulk API性能 - 监控JVM内存和GC情况 2. 查询性能测试 - 新字段作为过滤条件时的响应时间 - 高基数字段的聚合性能测试 五、异常场景 1. 冲突测试 - 已存在同名不同类型字段时的处理 - 动态模板与显式映射的优先级验证 2. 极限值测试 - 超长文本字段(超过ignore_above配置) - 数值溢出测试(如integer超过2^32) 六、数据迁移验证 1. Reindex测试 ```json POST _reindex { "source": {"index": "old_index"}, "dest": {"index": "new_index"} } // 验证新字段是否被正确迁移 ``` 七、监控项检查 1. 集群健康状态 - 黄色/红色状态预警测试 - 分片分配异常监控 2. 字段统计验证 ```json GET test_index/_field_usage_stats?fields=new_field ``` 建议结合ES官方验证工具: 1. 使用Elasticsearch Rally进行基准测试 2. 通过X-Pack Monitoring监控实时性能 3. 使用ILM策略验证生命周期管理 注意:测试环境建议使用与生产环境相同的硬件配置和数据集规模,特别注意测试嵌套字段(nested)和父子文档等复杂结构时的性能影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值