对于es的数据类型,如果是复杂类型,而我们需要检索复杂类型,应该定义为嵌套类型,而对于其检索,如果是非采集数据,则与其他类型无异;而如果你的nested中存储的数据是一个集合,那么在执行不等于的操作时需要说明一下。示例"id":"1","operate":[{"actionTime":"2017-03-2111:57:37.700","operateType":"WangLu","wordNum":"3188","userName":"zidongluru"},{"actionTime":"2017-03-2111:57:37.700","operateType":"DaoRu","wordNum":"3188","userName":"qinbixue1609"}]对于上面的数据,其中operate是一个嵌套类型,它把数据存储为一个集合,我们查询operateType不等于wanglu的数据,如果直接用not_mustwithterm,结果是错误的,会正常返回这个文档,为什么?据说王陆被纳入此操作,如果被纳入,则不应退还;这是es的retrievalnestedcollectionhandlinginequality的问题,它会在查询集合中所有元素的时候,如果有不等于WangLu的,就会认为是Notequal,这不符合我们的需求,所以我们必须想其他的方法。脚本无法检索嵌套集合{"size":5,"_source":["Gid","Type","operate"],"query":{"bool":{"must":[{"嵌套”:{“路径”:“操作”,“查询”:{“脚本”:{“脚本”:“doc['operate.operateType'].stream().map(o->o).filter(o->o=='YiJiaoSu').count()==0"}}}},{"term":{"Gid":"1970325267114815"}}]}}}用函数的方法解决这个问题.参考https://cloud.tencent.com/developer/article/1973186https://cloud.tencent.com/developer/article/1973186https://stackoverflow.com/questions/54022283/elasticsearch-search-query-why-params-source-nested-field-size-is-not-workin{"size":5,"_sourcee":["Gid","Type","operate"],"query":{"bool":{"must":[{"function_score":{"query":{"match_all":{}},"函数":[{"script_score":{"script":{"source":"params._source.operate.stream().map(o->o.operateType).filter(o->o=='一角塑').count()==0?1:0"}}}],"min_score":1}},{"term":{"Id":"1970325267114815"}}]}}}这种既然是重新检索集合中的collection,需要和其他检索条件一起使用,全表检索性能比较差。翻译成java客户端代码Stringval="条件";Stringname="嵌套内部字符串段名";StringscoreStr="params._source.operate==null||params._source.operate.stream().map(o->o."+name+").filter(o->o=='"+val+"').count()==0?1:0";Scriptsc=newScript(ScriptType.INLINE,Script.DEFAULT_SCRIPT_LANG,scoreStr,MapUtil.empty());ScriptScoreFunctionBuilder构建器=newScriptScoreFunctionBuilder(sc);FunctionScoreQueryBuilderscoreBuilder=QueryBuilders.functionScoreQuery(builder);scoreBuilder.setMinScore(1);scoreBuilder.scoreMode(FunctionScoreQuery.ScoreMode.FIRST);queryIncludeBuilder.must(scoreBuilder);
