软件编程
位置:首页>> 软件编程>> java编程>> SpringBoot框架集成ElasticSearch实现过程示例详解

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

作者:一个大泥球  发布时间:2023-02-02 08:44:05 

标签:SpringBoot,ElasticSearch

依赖

SpringBoot版本:2.4.2


<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框架集成ElasticSearch实现过程示例详解

与SpringBoot集成

配置类


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();
   }
}

实体类


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;//图片地址
}

测试例子

 


@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交互式类似的

索引操作


/**
* 这里时测试,开发时:通过 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();
   }
}

文档操作


@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();
   }
}

检索操作


@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

来源:https://blog.csdn.net/A_java_c/article/details/121067827

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com