SpringBoot下Jest实现ElasticSearch查询结果直接写入实体对象中

前一篇博文: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多见用于聚合结果写入实体类中。

读取数据时,推荐要使用分页的方法,尤其在读取量大时,采用适量多次获取数据的方法。

Spring Boot 中使用 JestClient 操作 Elasticsearch查询通常包括以下几个步骤: 1. **添加依赖**: 首先,在你的 `pom.xml` 或者 `build.gradle` 文件中添加 JestElasticsearch 客户端的依赖。例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>com.github.tlrx</groupId> <artifactId>jest-spring-boot-starter</artifactId> </dependency> ``` 这将自动引入所需的配置支持。 2. **配置客户端**: 在 `application.properties` 或 `application.yml` 中,配置 Jest 客户端连接 Elasticsearch 的信息,如集群地址、节点名称等: ```yaml spring.data.elasticsearch.cluster-name=my-cluster spring.data.elasticsearch.uris=http://localhost:9200 ``` 3. **创建 Repository**: 创建一个继承自 `ElasticsearchRepository` 的自定义仓库类,比如 `MyDocumentRepository`,指定索引类型和映射文档的类名: ```java public interface MyDocumentRepository extends ElasticsearchRepository<MyDocument, String> { // 定义查询方法,例如查询所有文档 List<MyDocument> findAll(); } ``` 其中 `MyDocument` 是你的数据模型类。 4. **执行查询**: 在服务层或业务逻辑中,你可以像操作数据库那样调用自定义的查询方法: ```java @Autowired private MyDocumentRepository repository; List<MyDocument> documents = repository.findAll(); // 查询所有文档 Document foundDoc = repository.findById(id); // 根据ID查询单个文档 ``` 5. **处理响应结果**: Jest 返回的是 Elasticsearch 的搜索响应,需要进一步处理成你需要的数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值