好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot框架集成ElasticSearch实现过程示例详解

依赖

SpringBoot版本:2.4.2

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

< dependencies >

        <!--lombok-->

        < dependency >

            < groupId >org.projectlombok</ groupId >

            < artifactId >lombok</ artifactId >

            < optional >true</ optional >

        </ dependency >

          < dependency >

            < groupId >org.springframework.boot</ groupId >

            < artifactId >spring-boot-starter-data-elasticsearch</ artifactId >

        </ dependency >

 

        < dependency >

            < groupId >org.springframework.boot</ groupId >

            < artifactId >spring-boot-starter-web</ artifactId >

        </ dependency >

 

        < dependency >

            < groupId >org.springframework.boot</ groupId >

            < artifactId >spring-boot-devtools</ artifactId >

            < optional >true</ optional >

            < scope >true</ scope >

        </ dependency >

        < dependency >

            < groupId >com.alibaba</ groupId >

            < artifactId >fastjson</ artifactId >

            < version >1.2.47</ version >

        </ dependency >

    </ dependencies >

    < dependencyManagement >

        < dependencies >

            < dependency >

                < groupId >org.springframework.cloud</ groupId >

                < artifactId >spring-cloud-dependencies</ artifactId >

                < version >2020.0.1</ version >

                < type >pom</ type >

                < scope >import</ scope >

            </ dependency >

            < dependency >

                < groupId >com.alibaba.cloud</ groupId >

                < artifactId >spring-cloud-alibaba-dependencies</ artifactId >

                < version >2021.1</ version >

                < type >pom</ type >

                < scope >import</ scope >

            </ dependency >

        </ dependencies >

    </ dependencyManagement >

先了解一下curl方式操作es

与SpringBoot集成

配置类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import org.elasticsearch.client.RestHighLevelClient;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.elasticsearch.client.ClientConfiguration;

import org.springframework.data.elasticsearch.client.RestClients;

import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;

@Configuration

public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {

     @Override

     @Bean

     public RestHighLevelClient elasticsearchClient() {

         final ClientConfiguration clientConfiguration = ClientConfiguration.builder()

                 .connectedTo( "localhost:9200" )

                 .build();

         return RestClients.create(clientConfiguration).rest();

     }

}

实体类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

import lombok.Data;

import org.springframework.data.annotation.Id;

import org.springframework.data.elasticsearch.annotations.Document;

import org.springframework.data.elasticsearch.annotations.Field;

import org.springframework.data.elasticsearch.annotations.FieldType;

@Data

@Document (indexName = "product" , shards = 3 , replicas = 1 )

public class Product {

     //必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id"

     @Id

     private Long id; //商品唯一标识

     /**

      * type : 字段数据类型

      * analyzer : 分词器类型

      * index : 是否索引(默认:true)

      * Keyword : 短语,不进行分词

      */

     @Field (type = FieldType.Text, analyzer = "ik_max_word" )

     private String title; //商品名称

     @Field (type = FieldType.Keyword)

     private String category; //分类名称

     @Field (type = FieldType.Double)

     private Double price; //商品价格

     @Field (type = FieldType.Keyword, index = false )

     private String images; //图片地址

}

测试例子

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

@RestController

@RequestMapping

public class TestESController {

     @Autowired

     private ElasticsearchRestTemplate elasticsearchRestTemplate;

     @Resource

     ProductMapper productMapper;

     @GetMapping

     public void createIndex() {

         //创建索引,系统初始化会自动创建索引

         System.out.println( "创建索引" );

     }

     @DeleteMapping

     public void deleteIndex() {

         //创建索引,系统初始化会自动创建索引

         boolean flg = elasticsearchRestTemplate.deleteIndex(Product. class );

         System.out.println( "删除索引 = " + flg);

     }

     @PostMapping

     public void save(){

         Product product = new Product();

         product.setId(1L);

         product.setTitle( "华为手机" );

         product.setCategory( "手机" );

         product.setPrice( 2999.0 );

         product.setImages( "http://www.atguigu/hw.jpg" );

         productMapper.save(product);

     }

     @PutMapping

     public void update(){

         Product product = new Product();

         product.setId(1L);

         product.setTitle( "小米 2 手机" );

         product.setCategory( "手机" );

         product.setPrice( 9999.0 );

         product.setImages( "http://www.atguigu/xm.jpg" );

         productMapper.save(product);

     }

     @GetMapping ( "/findById" )

     public void findById(){

         Product product = productMapper.findById(1L).get();

         System.out.println(product);

     }

     @GetMapping ( "/findAll" )

     public void findAll(){

         Iterable<Product> products = productMapper.findAll();

         for (Product product : products) {

             System.out.println(product);

         }

     }

     //删除

     @DeleteMapping ( "/delDocument" )

     public void delete(){

         Product product = new Product();

         product.setId(1L);

         productMapper.delete(product);

     }

     //批量新增

     @PostMapping ( "/addBatch" )

     public void saveAll(){

         List<Product> productList = new ArrayList<>();

         for ( int i = 0 ; i < 10 ; i++) {

             Product product = new Product();

             product.setId(Long.valueOf(i));

             product.setTitle( "[" +i+ "]小米手机" );

             product.setCategory( "手机" );

             product.setPrice( 1999.0 +i);

             product.setImages( "http://www.atguigu/xm.jpg" );

             productList.add(product);

         }

         productMapper.saveAll(productList);

     }

     //分页查询

     @GetMapping ( "/findByPageable" )

     public void findByPageable(){

         //设置排序(排序方式,正序还是倒序,排序的 id)

         Sort sort = Sort.by(Sort.Direction.DESC, "id" );

         int currentPage= 0 ; //当前页,第一页从 0 开始, 1 表示第二页

         int pageSize = 5 ; //每页显示多少条

         //设置查询分页

         PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);

         //分页查询

         Page<Product> productPage = productMapper.findAll(pageRequest);

         for (Product Product : productPage.getContent()) {

             System.out.println(Product);

         }

     }

}

RestHighLevelClient直接操作

这些操作,就是javaApi,和上图中,通过http方式和es交互式类似的

索引操作

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

/**

  * 这里时测试,开发时:通过 ESTemplate操作。Spring进行了封装

  */

@Slf4j

public class ESIndexTestCase {

     public static void main(String[] args) throws IOException {

         // 创建客户端

         RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder( new HttpHost( "localhost" , 9200 )));

         // 创建索引

         // CreateIndexRequest indexRequest = new CreateIndexRequest("book");

         // CreateIndexResponse indexResponse = esClient.indices().create(indexRequest, RequestOptions.DEFAULT);

         // boolean acknowledged = indexResponse.isAcknowledged();

         // log.error("响应{}",acknowledged);

         // 查询索引

         // GetIndexRequest getIndexRequest = new GetIndexRequest("book");

         // GetIndexResponse getIndexResponse = esClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);

         // log.info("getAliases:{}",getIndexResponse.getAliases());

         // log.info("getMappings:{}",getIndexResponse.getMappings());

         // log.info("getSettings:{}",getIndexResponse.getSettings());

         // 删除索引

         AcknowledgedResponse deleteRes = esClient.indices().delete( new DeleteIndexRequest( "book" ), RequestOptions.DEFAULT);

         boolean delAck = deleteRes.isAcknowledged();

         log.error( "delAck:{}" ,delAck);

         esClient.close();

     }

}

文档操作

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

@Slf4j

public class ESDocmentTestCase {

     public static void main(String[] args) throws IOException {

         // 创建客户端

         RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder( new HttpHost( "localhost" , 9200 )));

         // 新增文档

         // IndexRequest indexRequest = new IndexRequest("user");

         // indexRequest.id("1001");      

         // // 准备文档

         // User user = new User();

         // user.setName("张三");

         // user.setAge(22);

         // user.setSex("男");       

         // String userJson = JSONObject.toJSONString(user);

         // indexRequest.source(userJson, XContentType.JSON);

         // IndexResponse indexResponse = esClient.index(indexRequest, RequestOptions.DEFAULT);

         // log.error("getResult:==========>:{}",indexResponse.getResult());

         // 批量新增文档

         BulkRequest bulkRequest = new BulkRequest();

         bulkRequest.add( new IndexRequest( "user" ).id( "2001" ).source(XContentType.JSON, "name" , "张三" , "age" , "40" , "sex" , "男" ));

         bulkRequest.add( new IndexRequest( "user" ).id( "2002" ).source(XContentType.JSON, "name" , "222" , "age" , "10" , "sex" , "女" ));

         bulkRequest.add( new IndexRequest( "user" ).id( "2003" ).source(XContentType.JSON, "name" , "33333" , "age" , "20" , "sex" , "男" ));

         bulkRequest.add( new IndexRequest( "user" ).id( "2004" ).source(XContentType.JSON, "name" , "111" , "age" , "30" , "sex" , "男" ));

         bulkRequest.add( new IndexRequest( "user" ).id( "2005" ).source(XContentType.JSON, "name" , "2222" , "age" , "31" , "sex" , "女" ));

         BulkResponse bulkResponse = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);

         log.error( "getResult:==========>:{}" ,bulkResponse.getTook());

         // 更新文档(全量更新,局部更新)

 

         // UpdateRequest updateRequest = new UpdateRequest("user", "1001");

         // updateRequest.doc("sex","dddddd");

         // UpdateResponse updateResponse = esClient.update(updateRequest, RequestOptions.DEFAULT);

         // log.error("getResult:==========>:{}",updateResponse.getResult());

 

         // 根据_id查询文档

         // GetRequest getRequest = new GetRequest("user", "1001");

         // GetResponse getResponse = esClient.get(getRequest, RequestOptions.DEFAULT);

         // log.error("getResult:==========>:{}",getResponse.getSource());

 

         // 根据_id 删除数据

         // DeleteRequest deleteRequest = new DeleteRequest("user", "1001");

         // DeleteResponse deleteResponse = esClient.delete(deleteRequest, RequestOptions.DEFAULT);

         // log.error("getResult:==========>:{}",deleteResponse.getResult());

 

         // 批量删除(和批量新增类似)

         esClient.close();

     }

}

检索操作

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

@Slf4j

public class EsSearchTest {

     public static void main(String[] args) throws IOException {

         // 创建客户端

         RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder( new HttpHost( "localhost" , 9200 )));

         // 查询所有

         // SearchRequest searchRequest = new SearchRequest("user");

         // SearchSourceBuilder queryBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());

         // queryBuilder.from(0);

         // queryBuilder.size(4);

         // queryaBuilder.sort("age", SortOrder.DESC);

         // SearchRequest sourceRequest = searchRequest.source(queryBuilder);

         // SearchResponse searchResponse = esClient.search(sourceRequest, RequestOptions.DEFAULT);

         // log.error("getHits:======>{}", searchResponse.getHits().getTotalHits());

         // searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString()));

         // 2-组合查询

         // SearchRequest searchRequest = new SearchRequest("user");

         // BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

         // // 这里就是组合条件。和mysql where 组合类似

         // boolQueryBuilder.should(QueryBuilders.matchQuery("age","30"));

         // boolQueryBuilder.should(QueryBuilders.matchQuery("age","40"));

         // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQueryBuilder);

         // searchRequest.source(sourceBuilder);

         // SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);

         // searchResponse.getHits().forEach(hit -> System.err.println(hit.getSourceAsString()));

         // 3-范围查询

         // SearchRequest searchRequest = new SearchRequest("user");

         // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

         // RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");

         // rangeQuery.gte("30");

         // sourceBuilder.query(rangeQuery);

         // searchRequest.source(sourceBuilder);

         // SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);

         // searchResponse.getHits().forEach(hit -> System.out.println(hit.getSourceAsString()));

         //4-模糊查询+高亮

         SearchRequest searchRequest = new SearchRequest( "user" );

         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

         FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery( "name" , "张三" );

         sourceBuilder.query(fuzzyQuery);

         HighlightBuilder highlightBuilder = new HighlightBuilder();

         highlightBuilder.preTags( "<font color='red'>" );

         highlightBuilder.postTags( "</font>" );

         highlightBuilder.field( "name" );

         sourceBuilder.highlighter(highlightBuilder);

         searchRequest.source(sourceBuilder);

         SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);

         searchResponse.getHits().forEach(System.out::println);

         // 5-聚合查询

         esClient.close();

     }

}

内容来自B站

https://www.bilibili.com/video/BV1hh411D7sb?p=62

以上就是SpringBoot集成ElasticSearch实现过程示例详解的详细内容,更多关于SpringBoot框架集成ES的资料请关注其它相关文章!

原文链接:https://blog.csdn.net/A_java_c/article/details/121067827

查看更多关于SpringBoot框架集成ElasticSearch实现过程示例详解的详细内容...

  阅读:14次