前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java创建ES父子文档及查询

Java创建ES父子文档及查询

作者头像
用户7886150
修改2021-02-02 11:41:18
2.1K0
修改2021-02-02 11:41:18
举报
文章被收录于专栏:bit哲学院

参考链接: java 创建API文档

因为业务需求越来越变态,嵌套文档虽然香,但也架不住塞的东西太多,官方限制是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地址(暂时只有存储方法)

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档