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

广州做网站 信科便宜百度搜索网址大全

广州做网站 信科便宜,百度搜索网址大全,东莞行业网站建设,文创产品设计就业前景Java 实现 Elasticsearch 查询当前索引全部数据 需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后 需求背景 通常情况下,Elasticsearch 为了提高查询效率,对于不指定分页查询条数的查询语句,默认会返回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();// 初始化存储所有搜索结果的列表List<EsMeiqiaConversation> rows = new ArrayList<>();// 格式化搜索响应中的数据,并添加到rows列表中List<EsMeiqiaConversation> list1 = formatMeiqiaDto(searchResponse);rows.addAll(list1);//记录返回的uid nameList<MeiqiaConversation> list = new ArrayList<>();if (CollectionUtils.isNotEmpty(rows)) {//获取 uid nameMap<String, List<EsMeiqiaConversation>> collect = rows.stream().collect(Collectors.groupingBy(EsMeiqiaConversation::getClientUid, Collectors.toList()));Set<String> uids = collect.keySet();for (String u : uids) {MeiqiaConversation conv = new MeiqiaConversation();conv.setUid(u);//同一个uid 对应同一个 nameList<EsMeiqiaConversation> 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();// 初始化存储所有搜索结果的列表List<EsMeiqiaConversation> rows = new ArrayList<>();// 格式化搜索响应中的数据,并添加到rows列表中List<EsMeiqiaConversation> list1 = formatMeiqiaDto(searchResponse);rows.addAll(list1);// 使用Scroll方式遍历所有搜索结果do {// 准备下一次Scroll搜索,设置滚动时间为1分钟// 将scorllId循环传递 获取全部数据searchResponse = client.prepareSearchScroll(searchResponse.getScrollId()).setScroll(TimeValue.timeValueMinutes(1)).execute().actionGet();// 格式化新一批搜索结果,并添加到rows列表中List<EsMeiqiaConversation> 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 nameList<MeiqiaConversation> list = new ArrayList<>();if (CollectionUtils.isNotEmpty(rows)) {//获取 uid nameMap<String, List<EsMeiqiaConversation>> collect = rows.stream().collect(Collectors.groupingBy(EsMeiqiaConversation::getClientUid, Collectors.toList()));Set<String> uids = collect.keySet();for (String u : uids) {MeiqiaConversation conv = new MeiqiaConversation();conv.setUid(u);//同一个uid 对应同一个 nameList<EsMeiqiaConversation> 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.shuangfujiaoyu.com/news/29186.html

相关文章:

  • 局域网怎么搭建哈尔滨seo服务
  • 怎么让学生在网站上做问卷调查网站制作公司排名
  • 浙江嘉兴seo网站优化推广郴州网站建设推广公司
  • 徐州企业网站建设公司营销策略的概念
  • 做JSP网站买什么书站长seo综合查询工具
  • 建设一个公司网站需要什么条件重庆seo推广运营
  • 创业网站怎么做的做网站优化哪家公司好
  • 动态网站设计经验发布新闻的平台有哪些
  • 苹果手机做微电影网站潍坊网站定制模板建站
  • 网站 展示板长春网站优化咨询
  • 自学网站开发多久百度推广代理商有哪些
  • 域名查ip地址查询拼多多关键词优化是怎么弄的
  • 做网站海报百度的相关搜索
  • 乡土文化网站怎么做郑州网络seo公司
  • 番禺建设网站公司哪家好世界最新新闻
  • 外贸soho建网站绍兴seo优化
  • 国外设计网站图片优化方案英语
  • 百度地图开发网站网站怎么优化搜索
  • 佛山品牌网站设计制作微博指数
  • 网站开发就业前景搜索引擎营销怎么做
  • 自建淘宝客APP网站模板友链交换网站
  • 特色网站模板友链交易
  • 呼和浩特免费制作网站手机百度助手
  • 国外域名注册商排名深圳市企业网站seo营销工具
  • 移动端适配seo在线优化工具 si
  • 兰州城关区建设局网站最近一周的新闻热点事件
  • 山东省住房和城乡建设厅服务网站公关公司一般收费标准
  • wordpress分级访问权限常用的seo查询工具有哪些
  • 公司对网站排名如何做绩效海南seo顾问服务
  • 推广网站有哪些方式珠海网站建设优化