前一篇博文:SpringBoot下使用Jest实现对ElasticSearch的多条件查询 中使用Jest获取到ElasticSearch中的数据后其一中做法是转换为JsonObject后自行解析获取自己想要的字段信息放置到实体对象之中,这种做法虽然繁琐一点,但是有一个优点就是结构可以自己指定,不用再考虑层级关系如何。但是人是懒惰的,那么如何使用Jest将结果直接放置进实体之中呢?下面简单介绍一下做法。
一、构建实体
首先以下为demo的mapping:
{
"mapping": {
"info": {
"properties": {
"textInfo": {
"type": "nested",
"properties": {
}
},
"textId": {
"type": "keyword"
},
"textTags": {
"type": "nested",
"properties": {
}
}
}
}
}
}
其中,textId为keyword,剩下两个为复杂结构,详细便不列出,对应的程序内实体类为:
import java.util.List;
public class MInfo {
private String textId;
private List<textDetail> textInfo;
private List<textTag> textTags;
public String getTextId() {
return textId;
}
public void setTextId(String textId) {
this.textId = textId;
}
public List<textDetail> getTextInfo() {
return textInfo;
}
public void setTextInfo(List<textDetail> textInfo) {
this.textInfo = textInfo;
}
public List<textTag> getTextTags() {
return textTags;
}
public void setTextTags(List<textTag> textTags) {
this.textTags = textTags;
}
}
其实也就是写入时的实体,当然读取数据的时候不必要读取全部的数据,按需获取。
二、方法构造
public List<MInfo> getSentence(QueryConditions queryConditions, Integer begin){
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
List<MInfo> mInfos;
try{
setBoolQueryBuilder(queryBuilder, queryConditions);
searchSourceBuilder.query(queryBuilder).from(begin).size(limitSize);
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(indexName).addType(typeName).build();
JestResult jestResult = jestClient.execute(search);
mInfos = jestResult.getSourceAsObjectList(MInfo.class);
logger.info("已经获取条件下的信息");
return mInfos;
}catch (IOException e){
logger.error("获取指定条件下的信息:" + queryConditions.toString() + "IO异常:", e);
return null;
}catch (Exception e){
logger.error("获取指定条件下的信息:" + queryConditions.toString() + "异常:", e);
return null;
}
}
其中的setBoolQueryBuilder(queryBuilder, queryConditions)为自定义的通用设置检索条件的方法。
因为这里是查询es内数据,所以会得到多条结果,需要调用的是getSourceAsObjectList,而getSourceAsObject多见用于聚合结果写入实体类中。
读取数据时,推荐要使用分页的方法,尤其在读取量大时,采用适量多次获取数据的方法。