14. es 整合springboot

本文详细介绍了如何使用SpringBoot框架与Elasticsearch搜索引擎进行整合,包括项目的搭建、实体类设计、CRUD操作及高级查询如排序、聚合、自定义查询等。通过具体实例,展示了如何在实际应用中高效地利用Elasticsearch进行数据检索。

1.目的 

通过程序对es 进行增删改查

 

2. 实现过程

2.1 搭建springboot项目

be2d4b9a7230daa8bc5c9f7cf4956aaa63e.jpg

 

3bac53ce542ff280c6022f8fd61891aabf0.jpg

 

c82e5ea0c78c91eeae03a4dedc76fb09681.jpg

99a532fca7243300471cb595ac01654437f.jpg

 

手动加入lombok 的jar

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    <scope>provided</scope>
</dependency>

a249365663d19d6699a0e24a9d59c040833.jpg

 

2.2 增加

配置数据源

##本项目端口号
server.port=8888

##es所在服务器地址  端口9300
spring.data.elasticsearch.cluster-nodes = localhost:9300

6a60b3ec8d47a6448c59da0b7f9b6a92948.jpg

 

2.2.1 实体类 (很重要)

6a49a5f0ec0ecc5263e6fa8bd959f92ed46.jpg

2.2.2 controller层

fcfe1a3ab6e3a1f0bc6c6b2c0ce8dd87ddf.jpg

2.2.3 业务层

ac6d207919beace676ca4d1b61faed9fdab.jpg

 

acb8b50e2c680fb3de0b124bfd294620c5c.jpg

 

2.2.4 持久层

8e721e170d88690cb0c44fbeaf8f7b80483.jpg

2.2.5 测试

8b851c3e520f10d31eec4f578d5cc390e51.jpg

 

74b8ec7ce09f5aef503152bcc2a424b6f22.jpg

 

es库中效果

e54f6efae231fd4ebd49308d0d6f49a2881.jpg

2.3 删除

2.3.1 controller

013fa62a771158000f9fa284ec428ad4a2f.jpg

2.3.2 业务层

647ba7096d10c61073075a241223f3bee75.jpg

 

7fb63fb1211df4b23b412265482a3b85686.jpg

 

2.3.3 测试

d408672c24364ae1d7ea2b33c8341266776.jpg

 

结果:

85a610f32319515e41e2921a5820b33852b.jpg

 

2.4 更新

这个操作与保存操作可以公用一个方法  ,当id相同的时候进行修改,不同的时候进行新增

d8c6bfa71e8ace6ff5c9021463a7707c5da.jpg

cfcc183aae82e0ffafe0e9cf58beb91a505.jpg

2.5 查询

9c264ec23c813f7e5ec275ca3fcd8f257e9.jpg

2.5.1 基本查询

2.5.1.1 查询所有 不用任何条件

效果:

e9d0049a0f430a1d85893d3c4729cbfca02.jpg

(1)controller层

9ed557be12541f36b9aaf5f01372321578b.jpg

(2) 业务层

这里用到了jackson

eb79179c63139886493be3cef4048974d60.jpg

 

实现类

6c24ca18e219014ab67560629aea2d3aa2c.jpg

 

在处理数据的时候看一下返回的数据结构:

9b362628bd23bb3af08ab99c8eba521734c.jpg

 

2.5.1.2 根据某个字段进行排序

效果

7f4b4eb5b34e245ccbb24f4cad5922c41c5.jpg

(1) controller层

22dd18646f8ad4e30c37d0f8db9bbf4ac7e.jpg

(2) 业务层

接口:

a576fdbf42f06da0d5fc137a8505312e0c1.jpg

实现类:

f5691f012c8769b58988341b26885e33e77.jpg

 

2.5.1.3 根据id查询数据

 

0b2891f35bedee89f7e7e436a2329029d27.jpg

d8a8c12bb4db540536cc800503db2f2627f.jpg

(1)controller层

02574d424bf2a724c8214b15e062fedd46e.jpg

(2) 业务层

接口

8491b220fa661cbdb8f8fcb300714488434.jpg

实现类:a4bc8689cd72d86c01341dbfbad60f8f027.jpg

 

2.5.2  自定义方法查询

314ebbf5b27ec2384638b95403838c41e07.jpg

2.5.2.1 查询name相等的用户

效果:

4d2c093d319ac37195da46aa36af218f110.jpg

代码:

(1)controller层

46607e2c0ca3cd34b777f7dd9dafcf8be45.jpg

(2)业务层

接口:

58e8e33e306b0c0c2d35c7bc2fbee7cbd35.jpg

实现类:

7891b267db4603897d86ad2fb59bc22bd21.jpg

(3) 持久层

926ff0875dca71181159bb0d533e9f9e982.jpg

2.5.2.2 查询年龄相同 工作地点相同的人

效果:

b45ff777a7454199fedf49f1f52b4452100.jpg

(1)controller

d1493d5f2058e909010dcaf88c7b2df33d2.jpg

(2) 业务层

接口

da86a1b72b9ecc60960706d463395c81658.jpg

实现类:

8f6df0411aef18a7302ec780e9c952e6ecf.jpg

持久层:

86f11d8a8214b2c869ef574df4e9e0720a6.jpg

2.5.2.3  自定义方法Or查询 查询年龄=30 或  家住 深圳市的人

效果:

数据库中的数据

2e37da8e77487f59712559088c2b8490858.jpg

716036139b0b9c630e057ab9097dfcfe729.jpg

 

(1)controller

ec0e308d6a142600d9d9b2cddc7e0ac5b1e.jpg

(2) 业务层

接口:

405a8b3f995ef94a78b72a20aa6ed03245c.jpg

 

 

实现类:

19d136ccaeec3fa6cbb8d9c50e8b210f1f9.jpg

(3) 持久层

387247a124bf1c9138d3e4233321f548a7e.jpg

2.5.2.4 自定义方法Between查询  查询年龄<=29 age >=30的人

效果

2252d609886949330934abceb54c54788be.jpg

7b99d12c12df55c0c38137f0068fb70d365.jpg

(1)controller层

3cee7f256c3b19a2c4e5a76e26bad9356d8.jpg

(2) 业务层

接口

dadd64c9b49198227e1679ce25c9ddb2429.jpg

实现类:

6600f25938c436c4243f7aa86d653bd0c7f.jpg

(3)持久层

0900a2106ac1f226a8af8692262d9b1ef54.jpg

2.5.2.5  自定义方法like查询  查询名字含有 小的查询

效果:

28bb13a756df9491cfefc6a1006a42d82c3.jpg

945a6e4c4b4950905a380be705745becf3b.jpg

(1) controller层

024eaf17d1c3890bd9d844e0b6767845876.jpg

(2) 业务层

接口:

853d871e047e3caa6f76388fc0e1d084ff9.jpg

实现类:

a8e7cd1f8ecd715885195d36d95ec084a44.jpg

(3)持久层

79d7659357bd155e45ca5e15d1665ce0597.jpg

 

 

2.5.3 自定义查询

2.5.3.1  matchQuery(会分词  表中字段类型需要keyword) 

注意

f505a7861b14dc337e8d264ae4fc85c1a89.jpg

91da97c50d8f3a4a188b341632462ee813a.jpg

 

b6de840eadff44553f57af03602d82e58e4.jpg

(1) controller层

e131e9a2c1aef16948bd345cab28bba0c77.jpg

(2) 业务层

接口

1b683122f50a13f02b2420f1539887f3a02.jpg

实现类:

55a6e3ac498cd52f78af50b1b589a7a0e92.jpg

(3) 持久层

不需要写了

2.5.3.2 termQuery(不分词 表中字段类型是text类型)

效果:

情况1:type="text"   "analyzer": "ik_max_word"

558098124d3246515cc4ffc71b7241376d6.jpg

情况2:type="text"    只能查询一个字

db267ef00a0e8733340f2e0c65f37a64c62.jpg

2a9889154b99902ce0b0dc7d2b9f6d9f1aa.jpg

(1)controller层

32a31d27900ba907f19e44190454a175e60.jpg

(2) 业务层

接口

9d99d39a2b9229e1edd18e608a7588917c2.jpg

实现类:

24845074e377a1e9a3fe9213758bf5ebcf7.jpg

2.5.3.3 fuzzyQuery 模糊查询   @Field(type = FieldType.Text)  类型必须是这个类型

效果:

9e0f615d3598ecf65e05c12236ca0665724.jpg

b3b29e632b8073a2ce81efb166410db4ae9.jpg

(1) controller层

a61d81e9259aec1feb2ec03e3d99151ea46.jpg

(2) 业务层

接口:

1169863e7307a563cadca5118da82176e19.jpg

实现类:

c948bb097bca1486ff51cd24ae87bff7b36.jpg

 

2.5.4 分页查询

效果:

3797c45e8a1658e752a1ec1fad274d82e28.jpg

(1)controller层

ad52b1699b7b38c20927e241b7edf001573.jpg

(2)业务层

接口:

a5cf3551a1c91b6e8f648d1a44e7b4c57a2.jpg

实现类:

5102628c65c804583b2145691eca1e5d3a8.jpg

 

60d3e37d05bb9cbfa038b18ee574141916a.jpg

 

2.5.5 排序

550e98d828ba72fbf26be7196e12b549345.jpg

e8edca350d6bff12876e02363bfcd855f86.jpg

 

 

2.5.6 聚合

0469938767108f42575e8622e12d1c3b4cd.jpg

ee43ee55c22aca0fc61cf638044ae8692d6.jpg

 

项目中:

d6674183188647020b894e1b4d2030713fd.jpg

2.5.6.1 按某个字段分组

需求:分组查询每个班级 学生数量

设计表:对于的统计的字段不能进行分组(type=“keyword”)

d6674183188647020b894e1b4d2030713fd.jpg

(1) controller层

3f70f87d9d7c5fa51421b93306b6a35f44b.jpg

(2) 业务层

接口:

    8c7729cdaf5f516630ddb047e64134fd01b.jpg

 实现类:

//4.6.1 根据某个字段进行分组查询
@Override
public String polymerizationByColumn(String column) throws JsonProcessingException {
    //造一个list用于存放数据
    ArrayList<Map<String, Object>> list = new ArrayList<>();
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    // 不查询任何结果
    queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
    // 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为column
    queryBuilder.addAggregation(
            AggregationBuilders.terms(column).field(column));
    // 2、查询,需要把结果强转为AggregatedPage类型
    AggregatedPage<Student> aggPage = (AggregatedPage<Student>) this.esRepository.search(queryBuilder.build());
    // 3、解析
    // 3.1、从结果中取出名为brands的那个聚合,
    // 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型
    StringTerms agg = (StringTerms) aggPage.getAggregation(column);
    // 3.2、获取桶
    List<StringTerms.Bucket> buckets = agg.getBuckets();
    // 3.3、遍历
    for (StringTerms.Bucket bucket : buckets) {
        HashMap<String, Object> map = new HashMap<>();
        // 3.4、获取桶中的key,即班级名称
        map.put("class", bucket.getKeyAsString());
        // 3.5、获取桶中的文档数量  既各个班级下学生数量
        map.put("num", bucket.getDocCount());
        //将数据放入list
        list.add(map);
    }
    //数据处理为json
    String jsonData = JacksonUtils.obejectToJson(list);
    return jsonData;
}

c63e09dabf9aea9272e668f9de3eb8f9f0f.jpg

比较复杂  晚上回来 写呗

https://blog.youkuaiyun.com/zxc123e/article/details/79498113

https://www.cnblogs.com/dalaoyang/p/8990989.html

 

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=elasticsearch%E6%95%B4%E5%90%88springboot%20&oq=elasticsearch%25E6%2595%25B4%25E5%2590%2588springboot&rsv_pq=85bde8fb00023d6c&rsv_t=028bjx3W9VYdyYhoRpmL%2B35Z0ARouR0alx1Z3RuRjofd%2BAmE9sUEfdQQA3k&rqlang=cn&rsv_enter=0

转载于:https://my.oschina.net/u/4132381/blog/3059455

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值