SpringBoot与ES7实现多条件搜索

SpringBoot与ES7实现多条件搜索

利用Kibana内置的航班数据,查询从威尼斯到中国按票价升序排列的前10条航班数据。

第一步,新建SpringBoot功能,pom.xml引入四个依赖。

xml 复制代码
<dependency>
   <groupId>org.elasticsearch.client</groupId>
     <artifactId>elasticsearch‐rest‐high‐level‐client</artifactId>
     <version>7.9.3</version>
 </dependency>

 <dependency>
     <groupId>org.elasticsearch.client</groupId>
     <artifactId>elasticsearch‐rest‐client</artifactId>
     <version>7.9.3</version>
 </dependency>

 <dependency>
     <groupId>org.elasticsearch</groupId>
     <artifactId>elasticsearch</artifactId>
     <version>7.9.3</version>
 </dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

elasticsearch-rest-high-level-client是Elastic官方提供的高级REST客户端,它对ES的RESTful API进行封装,使用最简化的方式处理Java与ES之间的交互。相较SpringBoot提供的spring-boot-starter-data-elasticsearch,elasticsearch-rest-high-level-client提供了更灵活的使用方法以及与官方同步更新的支持。

第二步,开发ES应用程序,实现业务逻辑。

java 复制代码
@SpringBootTest
public class FlightIndexQueryTestor {
    @Test
    public void query() {
        //声明RestHighLevelClient对象
        RestHighLevelClient client = null;
        try {
            //********************Part1 构建客户端,创建请求 ********************
            //实例化RestHighLevelClient对象,传入IP端口
            client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.1 68.31.105", 9200)));
            //构建查询请求,指定索引为kibana_sample_data_flights
            SearchRequest request = neSearchRequest("kibana_sample_data_flights");
            //********************Part2 组织查询条件,设置排序、分页等选项 ******************
            //构建BoolQueryBuilder即布尔查询,组织多条件检索
            BoolQueryBuilder booleanQueryBuilder = QueryBuilders.boolQuery();
            //设置起始城市为威尼斯
            booleanQueryBuilder.must(QueryBuilders.termQuery("OriginCityName", "Veice"));
            //设置终点站为中国,两个条件必须同时成立,因此使用must22
            booleanQueryBuilder.must(QueryBuilders.termQuery("DestCountry", "CN"));
            //利用SearchSourceBuilder构建附加选项,如排序、分页、汇总等
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //将Boolean查询代入searchSourceBuilder
            searchSourceBuilder.query(booleanQueryBuilder);
            //分页选项,起始0行
            searchSourceBuilder.from(0);
            //截取前10行
            searchSourceBuilder.size(10);
            //开启命中统计(不分页时总行数),这一项设置为true,否则默认ES的记录总数上限为10000
            searchSourceBuilder.trackTotalHits(true);
            //按平均票价升序排列
            searchSourceBuilder.sort("AvgTicketPrice", SortOrder.ASC);
            //设置当前查询请求的筛选、分页、排序条件
            request.source(searchSourceBuilder);
            //********************Part3 执行查询,封装离线集合 ********************
            //执行查询,得到查询响应对象
            SearchResponse response = client.search(requestRequestOptions.DEFAULT);
            //得到查询命中的文档集合
            SearchHit[] hits = response.getHits().getHits();
            //离线集合
            List<Map<String, Object>> list = new ArrayList();
            //序列化工具类
            Gson gson = new Gson();
            //遍历结果
            for (SearchHit hit : hits) {
                //得到每一份文档的JSON数据
                String json = hit.getSourceAsString();
                //利用Gson的TypeToken类将JSON反序列化为Map对象
                Map<String, Object> doc = gson.fromJson(json, new TypeToken<LinkedHashMap<String, Object>>() {
                }.getType());
                //将Map放入集合
                list.add(doc);
                //打印结果
                System.out.println(doc);
            }
            //查询不分页时命中的记录总数
            long count = response.getHits().getTotalHits().value;
            System.out.println("符合条件文档总量为:" + count);
        } catch (IOException e) {
            throw new IllegalStateException(e);
        } finally {
            if (client != null) {
                try {
                    //********************Part4 关闭数据连接 ********************
                    //关闭客户端连接
                    client.close();
                } catch (IOException e) {
                }
            }
        }
    }
}
相关推荐
杜子不疼.40 分钟前
计算机视觉热门模型手册:Spring Boot 3.2 自动装配新机制:@AutoConfiguration 使用指南
人工智能·spring boot·计算机视觉
indexsunny3 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Redis缓存场景解析
java·spring boot·redis·缓存·微服务·消息队列·电商
无心水3 小时前
【分布式利器:腾讯TSF】7、TSF高级部署策略全解析:蓝绿/灰度发布落地+Jenkins CI/CD集成(Java微服务实战)
java·人工智能·分布式·ci/cd·微服务·jenkins·腾讯tsf
28岁青春痘老男孩8 小时前
JDK8+SpringBoot2.x 升级 JDK 17 + Spring Boot 3.x
java·spring boot
天若有情6738 小时前
校园二手交易系统实战开发全记录(vue+SpringBoot+MySQL)
vue.js·spring boot·mysql
while(1){yan}9 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
奋进的芋圆9 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
计算机程序设计小李同学9 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
Echo娴9 小时前
Spring的开发步骤
java·后端·spring
小刘爱搬砖10 小时前
SpringBoot3 + GraalVM安装和初次打包
spring boot·graalvm