当前位置: 首页 > news >正文

网站设计高大上山东省作风建设网站

网站设计高大上,山东省作风建设网站,安阳网站建设哪家正规,有wordpress模板安装教程Java 实现 Elasticsearch 查询当前索引全部数据 需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后 需求背景 通常情况下#xff0c;Elasticsearch 为了提高查询效率#xff0c;对于不指定分页查询条数的查询语句#xff0c;默认会返回10条数据。那么这就会有… Java 实现 Elasticsearch 查询当前索引全部数据 需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后 需求背景 通常情况下Elasticsearch 为了提高查询效率对于不指定分页查询条数的查询语句默认会返回10条数据。那么这就会有一种情况当你需要一次性返回 Elasticsearch 索引中的全部数据时就无法实现了。这个时候你可能会考虑比如我将每页取值的size 设置的很大这样或许可以解决问题但是数据量的上升你是无法控制的最终会有一天数据量会超过你此时设置的最大 size那么这就是一个雷点。并且如果一次查询很大量数据的话即便是 Elasticsearch 查询效率高的索引结构可能也会导致查询时长较长甚至响应超时。那么是否有一种查询效率高且相对灵活的方式可以查询 Elasticsearch 的索引中全部数据呢答案是有的。 通常情况 下面来看一下在不设置 size 大小的情况下执行 Elasticsearch 查询语句默认返回几条数据结果是默认返回 10条。执行如下查询命令 GET crm_meiqia_conversation/_search返回结果如图这时我们看到返回了 10 条数据 此时如果你需要查询更多数据的话你就可以通过指定 size 大小来查询更多数据比如执行如下命令 GET crm_meiqia_conversation/_search {size:20 }执行查询语句后返回的结果如图所示索引查询会返回你指定 size 大小的数据 很明显在一些特殊的场景下想要一次性查询指定条件下的所有数据改如何操作呢下面就来基于 Java 实现查询指定条件下的所有数据操作。 Java 实现查询 Elasticsearch 全部数据 在具体讲解如何通过 Java 实现查询 Elasticsearch 全部数据之前我们可以先来看一下我已经实现之后的查询效果。这里你可以看到滚动州已经变得很小这就是因为我查询出了指定条件下的全部数据导致的而不是默认的 10 条数据 而如果没有实现查询指定索引指定条件下的全部数据时看到的效果应该是这样的默认只能一次性查询 10 条数据返回 下面再来讲一下如何通过 Java 实现 查询 es 全部数据我们由浅入深来讲解首先来看一下默认查询 es 10条数据的代码Java 通过如下 SearchRequestBuilder searchRequest client.prepareSearch(indexProperties.getMeiqiaConversationIndex()).setTypes(indexProperties.getMeiqiaConversationType()).setQuery(query); 构造查询 es 索引代码这种情况没有设置 size 大小默认的话就是查询指定索引下 10条数据完整代码如下 public AjaxResult getMeiqiaUidList(MeiqiaConversation meiqiaConversation) {BoolQueryBuilder query QueryBuilders.boolQuery();BoolQueryBuilder boolQuery QueryBuilders.boolQuery();//会话idLong convId meiqiaConversation.getConvId();if (convId ! null) {boolQuery.filter(QueryBuilders.termQuery(convId,convId));}//会话日期String convStartDate (String) meiqiaConversation.getParams().get(convStartDate);String convEndDate (String) meiqiaConversation.getParams().get(convEndDate);if (StringUtils.isNotEmpty(convStartDate)) {Date date DateUtils.stringToDate(convStartDate, DateUtils.SDF_YMDHMS);boolQuery.filter(QueryBuilders.rangeQuery(convStartDate).gte(date.getTime()));}if (StringUtil.isNotEmptyString(convEndDate)) {Date date DateUtils.stringToDate(convEndDate, DateUtils.SDF_YMDHMS);boolQuery.filter(QueryBuilders.rangeQuery(convEndDate).lte(date.getTime()));}//会话日期Date convStartDate2 meiqiaConversation.getConvStartDate();Date convEndDate2 meiqiaConversation.getConvEndDate();if (Objects.nonNull(convStartDate2)) {boolQuery.filter(QueryBuilders.rangeQuery(convStartDate).gte(convStartDate2.getTime()));}if (Objects.nonNull(convEndDate2)) {boolQuery.filter(QueryBuilders.rangeQuery(convEndDate).lte(convEndDate2.getTime()));}//学号String uid (String) meiqiaConversation.getParams().get(uid);if (StringUtils.isNotEmpty(uid)) {if (uid.contains(#)) {String replace uid.replace(#, );boolQuery.filter(QueryBuilders.termQuery(clientInfo.name,replace));}else {boolQuery.filter(QueryBuilders.termQuery(clientInfo.uid,uid));}}//客服工号String agentId (String) meiqiaConversation.getParams().get(agentId);if (StringUtils.isNotEmpty(agentId)) {boolQuery.filter(QueryBuilders.termQuery(agentId,agentId));}// 会话内容String content (String) meiqiaConversation.getParams().get(content);if (StringUtils.isNotEmpty(content)) {boolQuery.filter(QueryBuilders.matchPhrasePrefixQuery(convContent.content,content));}query.must(boolQuery);// 初始化搜索请求构建器用于构造搜索请求SearchRequestBuilder searchRequest client.prepareSearch(indexProperties.getMeiqiaConversationIndex())// 设置搜索的类型.setTypes(indexProperties.getMeiqiaConversationType())// 设置查询条件.setQuery(query);// 使用SearchRequest获取搜索响应SearchResponse searchResponse searchRequest.get();// 初始化存储所有搜索结果的列表ListEsMeiqiaConversation rows new ArrayList();// 格式化搜索响应中的数据并添加到rows列表中ListEsMeiqiaConversation list1 formatMeiqiaDto(searchResponse);rows.addAll(list1);//记录返回的uid nameListMeiqiaConversation list new ArrayList();if (CollectionUtils.isNotEmpty(rows)) {//获取 uid nameMapString, ListEsMeiqiaConversation collect rows.stream().collect(Collectors.groupingBy(EsMeiqiaConversation::getClientUid, Collectors.toList()));SetString uids collect.keySet();for (String u : uids) {MeiqiaConversation conv new MeiqiaConversation();conv.setUid(u);//同一个uid 对应同一个 nameListEsMeiqiaConversation esconv collect.get(u);String name esconv.get(0).getClientName();conv.setName(name);list.add(conv);}}return AjaxResult.success(list);}那么如何实现 一次查询满足条件的全部 es 数据呢这就需要通过 scroll 实现在初始化索引查询构造器时通过 SearchRequestBuilder searchRequest client.prepareSearch(indexProperties.getMeiqiaConversationIndex()).setTypes(indexProperties.getMeiqiaConversationType()).setQuery(query).setSize(100).setScroll(TimeValue.timeValueMinutes(1)); 设置 scroll 参数来实现同时需要再后续增加再次查询索引逻辑将 scorllId 循环传递 获取全部数据最终改造后的获取全部数据的代码如下 public AjaxResult getMeiqiaUidList(MeiqiaConversation meiqiaConversation) {BoolQueryBuilder query QueryBuilders.boolQuery();BoolQueryBuilder boolQuery QueryBuilders.boolQuery();//会话idLong convId meiqiaConversation.getConvId();if (convId ! null) {boolQuery.filter(QueryBuilders.termQuery(convId,convId));}//会话日期String convStartDate (String) meiqiaConversation.getParams().get(convStartDate);String convEndDate (String) meiqiaConversation.getParams().get(convEndDate);if (StringUtils.isNotEmpty(convStartDate)) {Date date DateUtils.stringToDate(convStartDate, DateUtils.SDF_YMDHMS);boolQuery.filter(QueryBuilders.rangeQuery(convStartDate).gte(date.getTime()));}if (StringUtil.isNotEmptyString(convEndDate)) {Date date DateUtils.stringToDate(convEndDate, DateUtils.SDF_YMDHMS);boolQuery.filter(QueryBuilders.rangeQuery(convEndDate).lte(date.getTime()));}//会话日期Date convStartDate2 meiqiaConversation.getConvStartDate();Date convEndDate2 meiqiaConversation.getConvEndDate();if (Objects.nonNull(convStartDate2)) {boolQuery.filter(QueryBuilders.rangeQuery(convStartDate).gte(convStartDate2.getTime()));}if (Objects.nonNull(convEndDate2)) {boolQuery.filter(QueryBuilders.rangeQuery(convEndDate).lte(convEndDate2.getTime()));}//学号String uid (String) meiqiaConversation.getParams().get(uid);if (StringUtils.isNotEmpty(uid)) {if (uid.contains(#)) {String replace uid.replace(#, );boolQuery.filter(QueryBuilders.termQuery(clientInfo.name,replace));}else {boolQuery.filter(QueryBuilders.termQuery(clientInfo.uid,uid));}}//客服工号String agentId (String) meiqiaConversation.getParams().get(agentId);if (StringUtils.isNotEmpty(agentId)) {boolQuery.filter(QueryBuilders.termQuery(agentId,agentId));}// 会话内容String content (String) meiqiaConversation.getParams().get(content);if (StringUtils.isNotEmpty(content)) {boolQuery.filter(QueryBuilders.matchPhrasePrefixQuery(convContent.content,content));}query.must(boolQuery);// 初始化搜索请求构建器用于构造搜索请求SearchRequestBuilder searchRequest client.prepareSearch(indexProperties.getMeiqiaConversationIndex())// 设置搜索的类型.setTypes(indexProperties.getMeiqiaConversationType())// 设置查询条件.setQuery(query)// 设置返回结果的数量为100.setSize(100)// 设置滚动查询的时间间隔为1分钟.setScroll(TimeValue.timeValueMinutes(1));// 使用SearchRequest获取搜索响应SearchResponse searchResponse searchRequest.get();// 初始化存储所有搜索结果的列表ListEsMeiqiaConversation rows new ArrayList();// 格式化搜索响应中的数据并添加到rows列表中ListEsMeiqiaConversation list1 formatMeiqiaDto(searchResponse);rows.addAll(list1);// 使用Scroll方式遍历所有搜索结果do {// 准备下一次Scroll搜索设置滚动时间为1分钟// 将scorllId循环传递 获取全部数据searchResponse client.prepareSearchScroll(searchResponse.getScrollId()).setScroll(TimeValue.timeValueMinutes(1)).execute().actionGet();// 格式化新一批搜索结果并添加到rows列表中ListEsMeiqiaConversation list formatMeiqiaDto(searchResponse);if (CollectionUtils.isNotEmpty(list)) {rows.addAll(list);}// 当搜索结果为空时结束循环// 当searchHits的数组为空的时候结束循环至此数据全部读取完毕} while (searchResponse.getHits().getHits().length ! 0);// 创建一个ClearScrollRequest实例用于清除滚动查询的会话。ClearScrollRequest clearScrollRequest new ClearScrollRequest();// 将上一次查询返回的滚动ID添加到请求中以便清除这个特定的会话。// 这是必要的因为ClearScrollRequest需要至少一个滚动ID才能执行清除操作。clearScrollRequest.addScrollId(searchResponse.getScrollId());// 发送ClearScroll请求并获取操作的结果。// 这一步是必需的因为它实际执行了清除滚动会话的操作并允许我们处理结果或任何异常。client.clearScroll(clearScrollRequest).actionGet();//记录返回的uid nameListMeiqiaConversation list new ArrayList();if (CollectionUtils.isNotEmpty(rows)) {//获取 uid nameMapString, ListEsMeiqiaConversation collect rows.stream().collect(Collectors.groupingBy(EsMeiqiaConversation::getClientUid, Collectors.toList()));SetString uids collect.keySet();for (String u : uids) {MeiqiaConversation conv new MeiqiaConversation();conv.setUid(u);//同一个uid 对应同一个 nameListEsMeiqiaConversation esconv collect.get(u);String name esconv.get(0).getClientName();conv.setName(name);list.add(conv);}}return AjaxResult.success(list);}那么这段的核心代码是增加了滚动查询数据的操作如图所示 同时再执行循环查询时将 scrollId 循环传递并将查询结果 addAll 到当前list 的集合中 查询结束之后最后是清除滚动会话的操作 到这里关于 Java 实现 es 查询指定条件下的全部数据操作就结束了整个操作过程比较容易理解增加了 es 滚动查询 scroll 操作来实现查询 es 全部数据。 写在最后 最后想要说的是对于 es 查询通常情况下是不需要一次性查询出当前索引所有条件下的数据的毕竟数据量比较大但是也有特殊的场景这个时候不得不一次性查询出所有的数据这就需要上文中用到的办法了希望对大家有帮助。
http://www.hkea.cn/news/14402152/

相关文章:

  • 专业的营销网站建设公司flash翻页效果网站模板
  • 网站空间管理面板淘宝网站开始怎么做
  • 北京住房与城乡建设厅网站微信官方网站怎么进入
  • 网站建设 中企动力公司网站恶意点击
  • 制作企业网站定向推广
  • 重庆神态网站建设wordpress搬家后重新安装
  • 各大网站域名大全张家港做网站公司
  • 给个营销型网站聚名网查询
  • 互动网站策划网站开发基本构成
  • 什么网站开发外贸客户襄阳网站seo技巧
  • 怎么选择赣州网站建设电子商务做网站
  • 做网站用什么服务器好wordpress 迁移 插件
  • 喜满堂网站建设wordpress企业咨询模板
  • 手机网站如何制作视频网站用什么cms
  • 优化网站关键词百度经验app
  • 有没有电脑做兼职的网站临沂 网站优化
  • 自己能不能做个网站为什么要选择做花卉网站
  • 做古玩生意哪些网站好ppt制作入门教程
  • 网站源码搭建网站休闲农业有哪些网络营销方式
  • 成都网站快速排名提升哈尔滨优惠的网站建设
  • 校园网站如何管理课程网站建设目标任务
  • 东营网站建设预算价格骏域网站建设专家电话
  • jquery 个人网站wordpress oss 防盗链
  • 广州网站建设制作网站建设培训赚钱吗
  • wordpress博客文章图片美化短视频搜索优化
  • 厦门双模网站网站建设近义词
  • 江苏越润建设有限公司网站手机上自己设计房子软件
  • 360网站建设商家低价网站建设优化公司
  • 营销型网站 开源程序新版网站上线
  • 理解网络营销型网站的建设无极网站建设