ElasticSearch From-Size分页案例

bboss

1.定义from-size检索的dsl

定义from-size检索的dsl,里面包含外部需要传入的检索条件参数变量和分页参数变量:

  1. <!--
  2. 一个简单的检索dsl,中有四个变量
  3. applicationName1
  4. applicationName2
  5. startTime
  6. endTime
  7. 通过map传递变量参数值
  8. 变量语法参考文档:
  9. -->
  10. <property name="searchPagineDatas">
  11. <![CDATA[{
  12. "query": {
  13. "bool": {
  14. "filter": [
  15. { ## 多值检索,查找多个应用名称对应的文档记录
  16. "terms": {
  17. "applicationName.keyword": [#[applicationName1],#[applicationName2]]
  18. }
  19. },
  20. { ## 时间范围检索,返回对应时间范围内的记录,接受long型的值
  21. "range": {
  22. "agentStarttime": {
  23. "gte": #[startTime],##统计开始时间
  24. "lt": #[endTime] ##统计截止时间
  25. }
  26. }
  27. }
  28. ]
  29. }
  30. },
  31. ## 分页起点
  32. "from":#[from],
  33. ## 最多返回size条记录
  34. "size":#[size]
  35. }]]>
  36. </property>

2.加载dsl所在配置文件,并执行from-size分页检索

  1. /**
  2. * 分页检索文档
  3. * @throws ParseException
  4. */
  5. public void testPagineSearch() throws ParseException {
  6. //创建加载配置文件的客户端工具,用来检索文档,单实例多线程安全
  7. ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/demo.xml");
  8. //设定查询条件,通过map传递变量参数值,key对于dsl中的变量名称
  9. //dsl中有四个变量
  10. // applicationName1
  11. // applicationName2
  12. // startTime
  13. // endTime
  14. Map<String,Object> params = new HashMap<String,Object>();
  15. //设置applicationName1和applicationName2两个变量的值
  16. params.put("applicationName1","blackcatdemo2");
  17. params.put("applicationName2","blackcatdemo3");
  18. DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  19. //设置时间范围,时间参数接受long值
  20. params.put("startTime",dateFormat.parse("2017-09-02 00:00:00"));
  21. params.put("endTime",new Date());
  22. ESDatas<Demo> esDatas = null;//返回的文档封装对象类型
  23. //保存总记录数
  24. long totalSize = 0;
  25. //保存每页结果对象列表,最多返回1000条记录
  26. List<Demo> demos = null;
  27. int i = 0; //页码
  28. do{//遍历获取每页的记录
  29. //设置分页参数
  30. params.put("from",i * 1000);//分页起点
  31. params.put("size",1000);//每页返回1000条
  32. i ++;//往前加页码
  33. //执行查询,demo为索引表,_search为检索操作action
  34. esDatas = //ESDatas包含当前检索的记录集合,最多1000条记录,由dsl中的size属性指定
  35. clientUtil.searchList("demo/_search",//demo为索引表,_search为检索操作action
  36. "searchPagineDatas",//esmapper/demo.xml中定义的dsl语句
  37. params,//变量参数
  38. Demo.class);//返回的文档封装对象类型
  39. demos = esDatas.getDatas();//每页结果对象列表,最多返回1000条记录
  40. totalSize = esDatas.getTotalSize();//总记录数
  41. if(i * 1000 > totalSize)
  42. break;
  43. }while(true);
  44. // String json = clientUtil.executeRequest("demo/_search",//demo为索引表,_search为检索操作action
  45. // "searchDatas",//esmapper/demo.xml中定义的dsl语句
  46. // params);
  47. // String json = com.frameworkset.util.SimpleStringUtil.object2json(demos);
  48. System.out.println(totalSize);
  49. }

3.完整的demo实例工程

https://github.com/bbossgroups/eshelloword-booter

https://gitee.com/bbossgroups/eshelloword-booter

4 开发交流

elasticsearch技术交流群:166471282

elasticsearch微信公众号:

bboss微信公众号:bbossgroups