草庐IT

BBoss-ES操作数据及抽ES数据存到List数组

写程序的小王叔叔 2023-03-28 原文
主页:​写程序的小王叔叔的博客​​欢迎来访

支持:点赞​收藏关注

一、BBoss-ES操作数据 

1、pom.xml

<dependency>
<groupId>com.bbossgroups.plugins</groupId>
<artifactId>bboss-elasticsearch-spring-boot-starter</artifactId>
<version>6.0.0</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>

2、基本配置

elasticsearch:
host: 10.1*.**.**
port: 9200
bboss:
default:
name: default
elasticPassword: elastic
elasticUser: elastic
elasticsearch:
dateFormat: yyyy.MM.dd
discoverHost: false
rest:
hostNames: 1*.**.**.**:9200
scrollBlockedWaitTimeout: 0
scrollThreadCount: 200
scrollThreadQueue: 200
showTemplate: true
sliceScrollBlockedWaitTimeout: 0
sliceScrollThreadCount: 100
sliceScrollThreadQueue: 100
timeZone: Asia/Shanghai
http:
connectionRequestTimeout: 5000
customHttpRequestRetryHandler: org.frameworkset.spi.remote.http.ConnectionResetHttpRequestRetryHandler
defaultMaxPerRoute: 200
hostnameVerifier: ''
keyPassword: ''
keystore: ''
maxHeaderCount: 200
maxLineLength: -1
maxTotal: 400
retryTime: 1
staleConnectionCheckEnabled: false
timeoutConnection: 5000
timeoutSocket: 5000
validateAfterInactivity: 2000
dslfile:
refreshInterval: -1

3、结构配置

3.1 配置ESSTartConfigurer

import org.frameworkset.elasticsearch.boot.BBossESStarter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class ESSTartConfigurer {
@Primary
@Bean(initMethod = "start")
@ConfigurationProperties("spring.elasticsearch.bboss.default")
public BBossESStarter bbossESStarter(){
return new BBossESStarter();

}
}
3.2配置EsQueryToolsConfig

import com.alibaba.fastjson.JSONObject;
import org.frameworkset.elasticsearch.boot.BBossESStarter;
import org.frameworkset.elasticsearch.client.ClientInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class EsQueryToolsConfig {

@Autowired
private BBossESStarter bbossESStarterDefault;

/**
* 用sql查询
* @param sql
* @return
*/
public String queryForSQL(String sql){
ClientInterface clientUtil = bbossESStarterDefault.getRestClient();
JSONObject jsonObject = new JSONObject();
jsonObject.put("sql",sql);
String rtnJson = clientUtil.executeHttp("/_sql/", jsonObject.toJSONString(), ClientInterface.HTTP_POST);
return rtnJson;
}

/**
* 用原生的 es的dsl查询
* @param indexName
* @param dsl
* @return
*/
public String queryForDSL(String indexName,String dsl) {
ClientInterface clientUtil = bbossESStarterDefault.getRestClient();
String rtnJson = clientUtil.executeHttp("/" + indexName + "/_search", dsl, ClientInterface.HTTP_POST);
return rtnJson;
}

}

4、CRUD

4.1 - C

在业务接口 **impl 中,实现基本业务逻辑。

代码块代表当前业务逻辑,具体问题具体分析。

@Service
public class TeacherResourceServiceImpl implements TeacherResourceService {

@Autowired
private TeacherResourceDao teacherResourceDao;

@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;

@Override
public PageInfo<TeacherResourceVO> findTeacherResourceFromES(T*****TO t***TO) throws Exception{
List t*******OsList = new ArrayList();
PageInfo<T******O> teacherResPages = new PageInfo<>();
if (elasticsearchRestTemplate.indexExists("s*******n")){
//聚合获取学校id-教师id的相关信息
String teacherResJson = teacherResourceDao.findTeacherResourceList(t*******TO) ;
JSONObject buildTeacherObj = JSONObject.parseObject(teacherResJson);
JSONArray buildTeacherArr = buildTeacherObj.getJSONObject("aggregations").getJSONObject("b*******_id").getJSONArray("buckets");
for (int i = 0; i < buildTeacherArr.size(); i++) {
TeacherResourceVO teacherResourceVO = new TeacherResourceVO();
JSONObject teacherObj = buildTeacherArr.getJSONObject(i);
if (null != teacherObj) {
String teacherId = teacherObj.getString("key");
String teacherNameJson = teacherResourceDao.getUserNameFromES(teacherId);
JSONObject teacherNameObj = JSONObject.parseObject(teacherNameJson);
String teacherName = teacherNameObj.getJSONObject("hits").getJSONArray("hits").getJSONObject(0).getJSONObject("_source").getString("user_name");
JSONObject schoolNameObj = JSONObject.parseObject(schoolNameJson);
String schoolName = schoolNameObj.getJSONObject("hits").getJSONArray("hits").getJSONObject(0).getJSONObject("_source").getString("organization_name");
teacherResourceVO.setTeacherId(teacherId);
teacherResourceVO.setTeacherName(teacherName);
teacherResourceVO.setRecourceAccount(Integer.parseInt(teacherResCount));
teacherResourceVOsList.add(teacherResourceVO);
}
}
Integer totalNum = teacherResourceVOsList.size();
int pageNum =teacherResourceDTO.getPageNum();
int pageSize = teacherResourceDTO.getPageSize();
Integer totalPage = 0;
if (totalNum > 0) {
totalPage = totalNum % pageSize == 0 ? totalNum / pageSize : totalNum / pageSize + 1;
}
if (pageNum > totalPage) {
pageNum = totalPage;
}
int startPoint = (pageNum - 1) * pageSize;
int endPoint = startPoint + pageSize;
if (totalNum <= endPoint) {
endPoint = totalNum;
}
List PageList = new ArrayList();
PageList = t******OsList.subList(startPoint, endPoint);
teacherResPages.setPageNum(t*****TO.getPageNum());
teacherResPages.setPageSize(t*******O.getPageSize());
teacherResPages.setTotal(t******sList.size());
teacherResPages.setPages(totalPage );
teacherResPages.setList(PageList);
return teacherResPages;
}
return teacherResPages;
}
}
在dao层 引入文件【见上】:

@Autowired
private EsQueryToolsConfig esQueryToolsConfig;
/***
* 获取学校教师资源数量
* @param teacherResourceDTO
* @return
* @throws Exception
*/
public String findTeacherResourceList(T*******O *****O) throws Exception{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//基础sql
String select_sql = "select base_user_id , count(*) as teacherResCount from s*******n ";
String where_sql = "where 1=1 ";
String groupBy_sql = "group by base_user_id ";
String order_sql = " order by teacherResCount desc limit 10";
if(StringUtils.isNotBlank(t********O.getSchoolId())){
where_sql = where_sql.concat(" and b******_id = '" + t*******O.getSchoolId() + "' ");
}
if (StringUtils.isNotBlank(te*****O.getBeginDate())) {
long beginTime = simpleDateFormat.parse(t*****O.getBeginDate() + LoginConstant.START_TIME).getTime();
where_sql = where_sql.concat( " and create_time >= '" + beginTime + "' ");
}
if (StringUtils.isNotBlank(t******O.getEndDate())) {
long endTime = simpleDateFormat.parse(te********O.getEndDate() + LoginConstant.END_TIME).getTime();
where_sql = where_sql.concat( " and create_time < '" + endTime + "' ");
}
String sql = select_sql + where_sql + groupBy_sql ;
String retJson = this.esQueryToolsConfig.queryForSQL( sql );
System.out.println(sql);
return retJson;
}

二、抽ES数据存到List数组

//自定义 学科名称数组
ArrayList arraySubList = new ArrayList();
ArrayList arraySubIdList = new ArrayList();
if (elasticsearchRestTemplate.indexExists("s*******************b")) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices("s************b")
.withTypes("_***************")
.withQuery(boolQuery)
.build();
//统计学生的发布课程信息
List<St***************O> s*************Os = elasticsearchRestTemplate.queryForList(searchQuery, S*************O.class);
//根据学生发布课程编号获取学段,学科基本信息
for (int i = 0; i < stuIssueD**********s.size(); i++) {
String strCourseId = stu************s.get(i).getCourse_base_id();
//课程统计
BoolQueryBuilder queryCourseInfo = QueryBuilders.boolQuery();
queryCourseInfo.must(QueryBuilders.termQuery("co******id", strCourseId));
SearchQuery queryCourse = new NativeSearchQueryBuilder()
.withIndices("s****************o")
.withTypes("_d************************")
.withQuery(queryCourseInfo)
.build();
List<Co******O> co*************List = elasticsearchRestTemplate.queryForList(queryCourse, C***********O.class);
for (int j = 0; j < co**********ist.size(); j++) {
BoolQueryBuilder querySubInfo = QueryBuilders.boolQuery();
//学段信息
if (StringUtils.isNotBlank(subjectId)) {
querySubInfo.must(QueryBuilders.termQuery("s******de", subjectId));
} else {
querySubInfo.must(QueryBuilders.termQuery("s***********de", courseVOFromESList.get(j).getBusiness_subject_id()));
}
//学科信息
if (StringUtils.isNotBlank(stageId)) {
querySubInfo.must(QueryBuilders.termQuery("s******de", stageId));
} else {
querySubInfo.must(QueryBuilders.termQuery("s*******de", courseVOFromESList.get(j).getBu*******_id()));
}
SearchQuery querySubjectInfo = new NativeSearchQueryBuilder()
.withIndices("st*********t")
.withTypes("_***********c")
.withQuery(querySubInfo)
.build();
List<Su***********O> subList = elasticsearchRestTemplate.queryForList(querySubjectInfo, Su*********O.class);
//动态添加 - list数组
//动态添加 - list数组
arraySubList.add(subList.get(0).getSubject_name());
arraySubIdList.add(subList.get(0).getSubject_code());
}
}
List<St**********O> s**************List = homeworkService.getQuestionAndknowledgeTotal(s****************O);
for (int i = 0; i < st************List.size(); i++) {
//学生学习的课程数量
st**************List.get(i).setResourceAccount(s************s.size());
stud**************List.get(i).setSubjectId(subjectId);
//学科名称
subList.stream().map(S*******::getSubject_name).collect(Collectors.toList());
// studentSubResourceVOList.get(i).setSubjectName(subName.toString());
}

return studentSubResourceVOs;
}
转载声明:本文为博主原创文章,未经博主允许不得转载

⚠️注意 ~

?本期内容就结束了,如果内容有误,麻烦大家评论区指出!

如有疑问❓可以在评论区留言?或私信留言?,尽我最大能力?‍♀️帮大家解决?‍?!

如果我的文章有帮助到您,欢迎点赞+关注✔️鼓励博主?,您的鼓励是我分享的动力???~


有关BBoss-ES操作数据及抽ES数据存到List数组的更多相关文章

  1. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  6. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  7. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  8. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  9. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  10. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

随机推荐