本文涉及技术点:
- 1.删除和创建公司/雇员父子关系的索引表
- 2.bulk批量导入json格式数据
- 3.ormapping方式bulk批量导入数据
- 4.采用@ESId指定文档_id
- 5.采用@ESParentId制定子文档的parent信息
- 6.基本的has_child和has_parent公司/雇员父子关系检索
1.准备工作
参考文档《 高性能elasticsearch ORM开发库使用介绍》导入和配置es客户端
2.定义dsl文档
建立dsl配置文件-esmapper/indexparentchild.xml
3.实现has_child和has_parent检索
首先创建带公司和雇员关系的索引结构
public void createIndice(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/indexparentchild.xml"); try { //删除mapping clientUtil.dropIndice("company"); } catch (ElasticSearchException e) { // TODO Auto-generated catch block e.printStackTrace(); } //创建mapping clientUtil.createIndiceMapping("company","createCompanyEmployeeIndice"); }
然后通过bulk导入测试需要的公司和雇员数据,本案例通过加载配置文件中的dsl json data导入公司和雇员数据:
public void importData(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/indexparentchild.xml"); //导入公司数据,并且实时刷新,测试需要,实际环境不要带refresh clientUtil.executeHttp("company/company/_bulk?refresh","bulkImportCompanyData",ClientUtil.HTTP_POST); //导入雇员数据,并且实时刷新,测试需要,实际环境不要带refresh clientUtil.executeHttp("company/employee/_bulk?refresh","bulkImportEmployeeData",ClientUtil.HTTP_POST); }
如果需要根据List集合批量导入测试数据,则参考以下方法:
/** * 通过List集合导入雇员和公司数据 */ public void importDataFromBeans() { ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil(); //导入公司数据,并且实时刷新,测试需要,实际环境不要带refresh Listcompanies = buildCompanies(); clientUtil.addDocuments("company","company",companies,"refresh"); //导入雇员数据,并且实时刷新,测试需要,实际环境不要带refresh List employees = buildEmployees(); clientUtil.addDocuments("company","employee",employees,"refresh"); }
List
public class Company extends ESBaseData { private String name; /** * 将companyId作为索引_id的值 */ @ESId private String companyId; 。。。。。。
public class Employee extends ESBaseData { /** * 通过ESId注解将employeeId指定为雇员的文档_id */ @ESId private int employeeId; /** * 通过ESParentId注解将companyId指定为雇员的parent属性,对应Company中的文档_id的值 */ @ESParentId private String companyId;
接下来实现has_child和has_parent检索功能
/** * 通过雇员生日检索公司信息 */ public void hasChildSearchByBirthday(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/indexparentchild.xml"); Mapparams = new HashMap (); params.put("birthday","1980-01-01"); ESDatas escompanys = clientUtil.searchList("company/company/_search","hasChildSearchByBirthday",params,Company.class); List companyList = escompanys.getDatas();//获取符合条件的公司 long totalSize = escompanys.getTotalSize(); } /** * 通过雇员姓名检索公司信息 */ public void hasChildSearchByName(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/indexparentchild.xml"); Map params = new HashMap (); params.put("name","Alice Smith"); ESDatas escompanys = clientUtil.searchList("company/company/_search","hasChildSearchByName",params,Company.class); List companyList = escompanys.getDatas();//获取符合条件的公司 long totalSize = escompanys.getTotalSize(); } /** * 通过雇员数量检索公司信息 */ public void hasChildSearchByMinChild(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/indexparentchild.xml"); Map params = new HashMap (); params.put("min_children",2); ESDatas escompanys = clientUtil.searchList("company/company/_search","hasChildSearchByMinChild",params,Company.class); List companyList = escompanys.getDatas();//获取符合条件的公司 long totalSize = escompanys.getTotalSize(); } /** * 通过公司所在国家检索雇员信息 */ public void hasParentSearchByCountry(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/indexparentchild.xml"); Map params = new HashMap (); params.put("country","UK"); ESDatas escompanys = clientUtil.searchList("company/employee/_search","hasParentSearchByCountry",params,Employee.class); List companyList = escompanys.getDatas();//获取符合条件的公司 long totalSize = escompanys.getTotalSize(); }
通过junit测试用例执行上述功能
@Test public void test(){ createIndice(); importData(); hasChildSearchByBirthday(); this.hasChildSearchByName(); this.hasChildSearchByMinChild(); this.hasParentSearchByCountry(); }
4.参考文档
https://blog.csdn.net/napoay/article/details/52032931
https://gitee.com/bboss/elasticsearchdemo/blob/master/src/test/java/org/frameworkset/elasticsearch/parentchild/ParentChildTest.java
https://gitee.com/bboss/elasticsearchdemo/blob/master/src/test/resources/esmapper/indexparentchild.xml
测试用例对应的工程
https://gitee.com/bboss/elasticsearchdemo
5 开发交流
elasticsearch技术交流群:166471282
elasticsearch微信公众号:bbossgroups