springboot+Elasticsearch实现商品搜索、分...

程序你得看得懂 2024-10-01 05:38:27
在Spring Boot中结合Elasticsearch和Redis实现商品搜索、分页、排序和过滤功能是一个常见的需求。以下是一个基本的实现示例,其中涉及到了Spring Boot、Spring Data Elasticsearch和Spring Data Redis。 项目依赖首先,在pom.xml中添加必要的依赖: org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-elasticsearch org.springframework.boot spring-boot-starter-data-redis redis.clients jedis org.projectlombok lombok provided 配置文件在application.yml中配置Elasticsearch和Redis: spring: data: elasticsearch: cluster-nodes: localhost:9200 cluster-name: my-application redis: host: localhost port: 6379商品实体类创建一个商品实体类: import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; @Data @Document(indexName = "products") public Product { @Id private String id; private String name; private String description; private Double price; private String category; // 其他字段 }Elasticsearch Repository创建一个Elasticsearch的Repository接口: import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; @Repository public interface ProductRepository extends ElasticsearchRepository { // 这里可以定义一些自定义的查询方法 }Redis Service创建一个简单的Redis Service用于缓存: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.List; @Service public RedisService { @Autowired private RedisTemplate redisTemplate; @Cacheable(value = "products", key = "#root.method.name") public List getCachedProducts() { // 从数据库或者Elasticsearch获取商品列表并缓存 // 这里只是一个示例,实际调用可能复杂得多 return null; // 替换为实际商品列表 } // 其他缓存相关的方法 }商品服务类创建一个服务类处理商品搜索、分页、排序和过滤: import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.stereotype.Service; @Service public ProductService { @Autowired private ProductRepository productRepository; @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; @Autowired private RedisService redisService; public Page searchProducts(String keyword, String category, int page, int size, String sortField, SortOrder sortOrder) { Pageable pageable = PageRequest.of(page, size); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.multiMatchQuery(keyword, "name", "description")) .withPageable(pageable) .withSort(SortBuilders.fieldSort(sortField).order(sortOrder)) .withFilter(QueryBuilders.termQuery("category", category)) .build(); // 尝试从缓存获取 List cachedProducts = redisService.getCachedProducts(); if (cachedProducts != null && !cachedProducts.isEmpty()) { // 如果缓存命中,可以进一步处理缓存数据(如分页、排序) // 这里为了简单,直接使用Elasticsearch查询 } return elasticsearchRestTemplate.queryForPage(searchQuery, Product.class); } // 其他商品相关的方法 }控制器创建一个控制器提供REST API: import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public ProductController { @Autowired private ProductService productService; @GetMapping("/search") public Page search( @RequestParam String keyword, @RequestParam(required = false) String category, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, @RequestParam(defaultValue = "price") String sortField, @RequestParam(defaultValue = "asc") SortOrder sortOrder) { return productService.searchProducts(keyword, category, page, size, sortField, sortOrder); } }运行项目确保Elasticsearch和Redis服务已经启动,然后运行Spring Boot应用程序。你可以通过访问类似http://localhost:8080/search?keyword=some_keyword来进行商品搜索。 注意事项Elasticsearch索引管理:在实际生产环境中,你可能需要更精细地管理Elasticsearch索引,包括映射、分词器等。缓存策略:这里的缓存策略非常简单,只是示例。实际项目中可能需要更复杂的缓存机制和策略。安全性:对于实际项目,请确保添加适当的安全措施,如身份验证和授权。性能优化:对于大规模数据,请确保对Elasticsearch和Redis进行适当的性能优化。
0 阅读:0

程序你得看得懂

简介:感谢大家的关注