Java创建ES父子文档及查询

因为业务需求越来越变态,嵌套文档虽然香,但也架不住塞的东西太多,官方限制是10000,虽然可以改,但是我改了之后,发现还是有文档没录进去,遂寻求他法,最后尝试父子文档解决问题。其实不到万不得已,嵌套文档是效率最高的。

1.创建mapping

public static XContentBuilder corpMapping(){
        XContentBuilder mapping = null ;
        try {
            mapping = jsonBuilder()
                    .startObject()
                        .startObject("properties")
                            .startObject("id").field("type","keyword").endObject()
                            .startObject("personId").field("type","keyword").endObject()
                            .startObject("prjType").field("type","keyword").endObject()
                            .startObject("prjAim").field("type","keyword").endObject()
                            .startObject("prjName").field("type","keyword").endObject()
                            //在此处声明父子关系
                            .startObject("companyPersonRelation")
                                .field("type","join")
                                    .startObject("relations")
                                    .field("company",new String[]{"personPerformance","corpPerformance"})
                                .endObject()
                            .endObject()
                        .endObject()
                    .endObject();
        }catch (Exception e){
            e.printStackTrace();
        }
        return mapping ;
    }

插入文档

//处理子类关系,父类可以什么都不用处理,就普通那样子存,子类一定要表明自己父亲是谁
  Map<String,String> map = new HashMap<>();
  map.put("name","corpPerformance");
  map.put("parent",corpId);


BulkRequest bulkRequest = new BulkRequest();
                for (T tt : list) {
                    String id = getESId(tt) ;
                    //routing就是父类"_id"
                    String routingId = getRoutingId(tt) ;
                    IndexRequest request = new IndexRequest(index,type,id);
                    bulkRequest.add(request.routing(routingId).source(JSON.toJSONString(tt), XContentType.JSON));
                }

                bulkResponse = this.restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);

查询

//这里的queryBuilder就是子类的各种查询条件,当你想要根据子类查询父类时,只需要将子类的条件放入HasChildQueryBuilder 
//同理,要根据父类查询子类,只需用到HasParentQueryBuilder
HasChildQueryBuilder hcb = new HasChildQueryBuilder("corpPerformance",queryBuilder,Avg);

代码demo地址(暂时只有存储方法)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值