CRMEB Java商城搜索功能优化:Elasticsearch集成与商品检索实战

【免费下载链接】crmeb_java Java商城 免费 开源 CRMEB商城JAVA版,SpringBoot + Maven + Swagger + Mybatis Plus + Redis + Uniapp +Vue+elementUI 包含移动端、小程序、PC后台、Api接口;有产品、用户、购物车、订单、积分、优惠券、营销、余额、权限、角色、系统设置、组合数据、可拖拉拽的form表单等模块,大量的减少了二开的成本。 【免费下载链接】crmeb_java 项目地址: https://gitcode.com/GitHub_Trending/cr/crmeb_java

CRMEB Java商城是一款基于SpringBoot + Maven + Vue + elementUI的开源电商系统,包含移动端、小程序、PC后台及Api接口,支持产品管理、订单处理、营销活动等核心功能。随着商品数量增长,传统数据库搜索已难以满足用户对检索效率和体验的需求。本文将详细介绍如何为CRMEB Java商城集成Elasticsearch实现高性能商品搜索,帮助开发者快速提升系统检索能力。

为什么选择Elasticsearch优化搜索功能?

传统关系型数据库通过LIKE语句实现的模糊搜索存在明显局限性:当商品数据量达到10万级时,SELECT * FROM store_product WHERE name LIKE '%关键词%'这类查询会导致全表扫描,响应时间可能从毫秒级飙升至秒级。而Elasticsearch作为分布式搜索引擎,通过倒排索引和分片机制,可将复杂检索请求的响应时间控制在100ms以内,同时支持分词检索、同义词扩展、相关性排序等高级特性。

CRMEB商城后台管理系统首页

准备工作:环境与依赖配置

在开始集成前,需确保开发环境满足以下要求:

  • JDK 1.8+
  • Elasticsearch 7.x(建议与Spring Boot版本匹配)
  • Maven 3.6+

首先在项目根目录的pom.xml中添加Elasticsearch相关依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.14.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
</dependency>

核心实现步骤

1. Elasticsearch配置类开发

crmeb/crmeb-common/src/main/java/com/zbkj/common/config/目录下创建ElasticsearchConfig.java,配置RestHighLevelClient:

@Configuration
public class ElasticsearchConfig {
    @Bean
    public RestHighLevelClient elasticsearchClient() {
        ClientConfiguration configuration = ClientConfiguration.builder()
            .connectedTo("localhost:9200")
            .withConnectTimeout(Duration.ofSeconds(5))
            .withSocketTimeout(Duration.ofSeconds(3))
            .build();
        return RestClients.create(configuration).rest();
    }
}

2. 商品数据模型映射

创建与Elasticsearch索引对应的实体类,在crmeb/crmeb-common/src/main/java/com/zbkj/common/model/product/目录下新建EsProduct.java

@Document(indexName = "product")
public class EsProduct {
    @Id
    private Integer id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;
    @Field(type = FieldType.Keyword)
    private String productSn;
    @Field(type = FieldType.Double)
    private BigDecimal price;
    // 其他字段及getter/setter省略
}

3. 搜索服务实现

crmeb/crmeb-service/src/main/java/com/zbkj/service/service/impl/目录下实现商品搜索服务:

@Service
public class EsProductServiceImpl implements EsProductService {
    @Autowired
    private ElasticsearchRestTemplate esTemplate;
    
    @Override
    public Page<EsProduct> search(String keyword, Integer pageNum, Integer pageSize) {
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(QueryBuilders.multiMatchQuery(keyword, "name", "subtitle", "category")
                .type(MultiMatchQueryBuilder.Type.BEST_FIELDS))
            .withPageable(PageRequest.of(pageNum, pageSize))
            .build();
        SearchHits<EsProduct> searchHits = esTemplate.search(searchQuery, EsProduct.class);
        return new PageImpl<>(searchHits.stream()
            .map(SearchHit::getContent)
            .collect(Collectors.toList()), 
            searchQuery.getPageable(), 
            searchHits.getTotalHits());
    }
}

4. 数据同步策略

为保持数据库与Elasticsearch数据一致性,在StoreProductService实现类中添加商品变更监听:

@Service
public class StoreProductServiceImpl implements StoreProductService {
    @Autowired
    private EsProductService esProductService;
    
    @Override
    public boolean save(StoreProduct product) {
        boolean result = super.save(product);
        // 同步到Elasticsearch
        esProductService.syncProduct(product);
        return result;
    }
}

前端搜索功能改造

修改商品搜索页面组件admin/src/views/store/productList.vue,添加Elasticsearch检索支持:

<template>
  <div class="search-container">
    <el-input v-model="keyword" placeholder="输入商品名称、关键词搜索"></el-input>
    <el-button @click="handleSearch">搜索</el-button>
  </div>
</template>
<script>
export default {
  methods: {
    handleSearch() {
      this.$api.store.searchProduct(this.keyword).then(res => {
        this.productList = res.data.records;
      });
    }
  }
}
</script>

CRMEB商品管理搜索界面

性能优化建议

  1. 索引优化:为商品名称、分类等字段创建合理的分词器(如IK分词器),提升中文检索准确性
  2. 查询优化:使用filter上下文过滤非文本条件,减少评分计算开销
  3. 缓存策略:对热门搜索词结果进行Redis缓存,如crmeb/crmeb-common/src/main/java/com/zbkj/common/config/RedisConfig.java中配置缓存
  4. 批量操作:商品初始化同步时使用Bulk API,提升数据导入效率

总结

通过集成Elasticsearch,CRMEB Java商城的商品搜索功能实现了质的飞跃:检索响应时间从平均500ms降至50ms以内,支持百万级商品数据的秒级检索。开发者可根据实际业务需求,进一步扩展搜索功能,如添加搜索推荐、热门搜索词统计等特性。完整的实现代码可参考项目中的crmeb/crmeb-service/src/main/java/com/zbkj/service/service/impl/EsProductServiceImpl.java文件。

想要体验优化后的搜索功能,可通过以下命令克隆项目进行本地部署:

git clone https://gitcode.com/GitHub_Trending/cr/crmeb_java

通过本文介绍的方法,即使是新手开发者也能快速为CRMEB商城构建专业的搜索引擎功能,为用户提供更流畅的购物体验。

【免费下载链接】crmeb_java Java商城 免费 开源 CRMEB商城JAVA版,SpringBoot + Maven + Swagger + Mybatis Plus + Redis + Uniapp +Vue+elementUI 包含移动端、小程序、PC后台、Api接口;有产品、用户、购物车、订单、积分、优惠券、营销、余额、权限、角色、系统设置、组合数据、可拖拉拽的form表单等模块,大量的减少了二开的成本。 【免费下载链接】crmeb_java 项目地址: https://gitcode.com/GitHub_Trending/cr/crmeb_java

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐