1.背景我们在使用es的时候,有时候需要动态返回一些字段,而这些字段是动态计算的,那么这时候怎么操作呢?比如:我们的索引中有一个sex字段,存储为1或者0,需要在页面显示男性或者女性,那么就可以使用script_fields来解决这个问题。可能有人会说我可以通过后台格式化,但是假设我们需要在kibana等可视化工具上展示呢?2、准备数据2.1mappingPUT/index_script_fields{"mappings":{"properties":{"name":{"type":"keyword"},"sex":{"type":"integer"},"hobbies":{"type":"keyword"},"address":{"properties":{"province":{"type":"keyword"},"city":{"type":"keyword"}}}}}}注意:hobbies其实是一个数组类型address是一个Object类型,也就是复杂类型2.2插入数据PUT/index_script_fields/_bulk{"index":{"_id":1}}{"name":"张三","性别":1,"爱好":["足球","篮球"],"地址":{"省":"湖北","城市":"city01"}}{"index":{"_id":2}}{"name":"张三","sex":2,"address":{"province":"北京","city":"city01"}}{"index":{"_id":3}}{"name":"张三","hobbies":["football"],"address":{"province":"湖北","city":"city01"}}注意:需要注意的是id=3的数据是没有sex属性的,那么如何保证painless脚本不报错3.Case3.1格式gender1-male2-female-1-unknown如果没有sex字段,则显示--其余显示**3.1.1dslGET/index_script_fields/_search{"query":{"match_all":{}},"_source":["*"],"script_fields":{"sex_format":{"script":{"lang":"painless","source":"""//判断sex字段是否存在if(doc['sex'].size()==0){return"--";}if(doc['sex'].value==1){return"male";}elseif(doc['sex'].value==2){return"female";}elseif(doc['sex'].value==-1){return"unknown";}else{return"**";}"""}}}}注意sex字段不存在,如何判断,看上面代码3.1.2java代码@Test@DisplayName("Formatgender1-male2-female-1-unknown如果sex不存在则显示--其余显示**")publicvoidtest01()throwsIOException{SearchRequestrequest=SearchRequest.of(searchRequest->searchRequest.index(INDEX_NAME).query(query->query.matchAll(matchAll->matchAll))//如果不加这句,_source不会返回,值返回字段.source(config->config.filter(filter->filter.includes("*"))).scriptFields("sex_format",field->field.script(script->script.inline(inline->inline.lang(ScriptLanguage.Painless).source("//判断sex字段是否存在\n"+"if(doc['sex'].size()==0){\n"+"return\"--\";\n"+"}\n"+"\n"+"if(doc['sex'].value==1){\n"+"return\"男\";\n"+"}elseif(doc['sex'].value==2){\n"+"return\"女\";\n"+"}elseif(doc['sex'].value==-1){\n"+"return\"未知\";\n"+"}else{\n"+"返回\"**\";\n"+"}")))).size(100));System.out.println("请求:"+request);SearchResponse