springboot 中怎么整合solr

发布时间:2021-07-30 14:25:10 作者:Leah
来源:亿速云 阅读:281
# SpringBoot 中怎么整合Solr

## 目录
- [一、Solr 简介](#一solr-简介)
  - [1.1 什么是Solr](#11-什么是solr)
  - [1.2 Solr 核心概念](#12-solr-核心概念)
  - [1.3 Solr 与 Elasticsearch 对比](#13-solr-与-elasticsearch-对比)
- [二、环境准备](#二环境准备)
  - [2.1 JDK 安装](#21-jdk-安装)
  - [2.2 Solr 安装与启动](#22-solr-安装与启动)
  - [2.3 创建SpringBoot项目](#23-创建springboot项目)
- [三、SpringBoot 整合 Solr](#三springboot-整合-solr)
  - [3.1 添加依赖](#31-添加依赖)
  - [3.2 配置Solr连接](#32-配置solr连接)
  - [3.3 创建实体类](#33-创建实体类)
  - [3.4 创建Repository接口](#34-创建repository接口)
- [四、Solr 基本操作](#四solr-基本操作)
  - [4.1 添加/更新文档](#41-添加更新文档)
  - [4.2 查询文档](#42-查询文档)
  - [4.3 删除文档](#43-删除文档)
  - [4.4 分页查询](#44-分页查询)
- [五、高级查询功能](#五高级查询功能)
  - [5.1 高亮显示](#51-高亮显示)
  - [5.2 分组统计](#52-分组统计)
  - [5.3 范围查询](#53-范围查询)
  - [5.4 排序与权重](#54-排序与权重)
- [六、SolrCloud 集群整合](#六solrcloud-集群整合)
  - [6.1 SolrCloud 架构](#61-solrcloud-架构)
  - [6.2 SpringBoot 连接SolrCloud](#62-springboot-连接solrcloud)
- [七、性能优化](#七性能优化)
  - [7.1 索引优化](#71-索引优化)
  - [7.2 查询优化](#72-查询优化)
  - [7.3 JVM调优](#73-jvm调优)
- [八、常见问题排查](#八常见问题排查)
  - [8.1 连接超时问题](#81-连接超时问题)
  - [8.2 字段映射异常](#82-字段映射异常)
  - [8.3 中文分词问题](#83-中文分词问题)
- [九、完整代码示例](#九完整代码示例)
- [十、总结与扩展](#十总结与扩展)

---

## 一、Solr 简介

### 1.1 什么是Solr

Apache Solr 是一个基于Apache Lucene构建的开源企业级搜索平台,具有以下核心特性:

- **全文检索**:支持复杂的搜索表达式和近实时搜索
- **高性能**:支持分布式索引和查询
- **可扩展性**:通过SolrCloud支持水平扩展
- **丰富的API**:支持RESTful HTTP/JSON接口
- **管理界面**:内置直观的Web管理控制台

### 1.2 Solr 核心概念

| 概念          | 说明                                                                 |
|---------------|----------------------------------------------------------------------|
| Core          | 独立的索引库,包含配置文件和数据                                    |
| Document      | 索引和搜索的基本单位,相当于数据库中的一行记录                      |
| Field         | 文档的组成字段,可定义类型和属性                                    |
| Schema        | 定义字段类型和文档结构的元数据                                      |
| Query Parser  | 将查询字符串转换为Lucene查询对象的组件                              |
| Request Handler | 处理特定类型请求的组件(如搜索、更新等)                           |

### 1.3 Solr 与 Elasticsearch 对比

| 特性          | Solr                          | Elasticsearch                |
|---------------|-------------------------------|-------------------------------|
| 诞生时间      | 2006年                        | 2010年                        |
| 架构设计      | 更传统,适合静态数据集        | 更分布式,适合动态数据        |
| 社区生态      | Apache基金会维护              | Elastic公司主导               |
| 实时性        | 近实时(NRT)                 | 真正实时                      |
| 管理界面      | 内置完善                      | 需安装插件                    |
| 适用场景      | 企业搜索、电商平台            | 日志分析、监控系统            |

---

## 二、环境准备

### 2.1 JDK 安装

Solr 8.x+需要JDK 11或更高版本:

```bash
# 检查Java版本
java -version

# 若未安装,使用Homebrew安装(Mac)
brew install openjdk@11

2.2 Solr 安装与启动

  1. 下载解压(以9.1.0为例):
wget https://dlcdn.apache.org/solr/solr/9.1.0/solr-9.1.0.tgz
tar -xzf solr-9.1.0.tgz
cd solr-9.1.0
  1. 启动服务:
bin/solr start -p 8983
  1. 创建核心:
bin/solr create_core -c products
  1. 访问管理界面:
http://localhost:8983/solr

2.3 创建SpringBoot项目

使用Spring Initializr创建项目: - 依赖选择:Spring Web, Spring Data Solr, Lombok

或手动添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>

三、SpringBoot 整合 Solr

3.1 添加依赖

确保pom.xml包含:

<dependencies>
    <!-- Spring Data Solr -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-solr</artifactId>
    </dependency>
    
    <!-- 其他必要依赖 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

3.2 配置Solr连接

application.yml配置:

spring:
  data:
    solr:
      host: http://localhost:8983/solr
      zk-host: localhost:9983 # SolrCloud模式需要
      repositories:
        enabled: true

3.3 创建实体类

使用@Field注解映射Solr字段:

import org.apache.solr.client.solrj.beans.Field;
import lombok.Data;

@Data
@SolrDocument(collection = "products")
public class Product {
    @Field("id")
    private String id;
    
    @Field("name_txt_en")
    private String name;
    
    @Field("price_f")
    private Float price;
    
    @Field("category_s")
    private String category;
}

3.4 创建Repository接口

继承SolrCrudRepository

public interface ProductRepository extends SolrCrudRepository<Product, String> {
    
    List<Product> findByName(String name);
    
    @Query("category:?0 AND price:[?1 TO ?2]")
    List<Product> findByCategoryAndPriceRange(String category, float min, float max);
}

四、Solr 基本操作

4.1 添加/更新文档

@Service
public class ProductService {
    
    @Autowired
    private ProductRepository repository;
    
    public void saveProduct(Product product) {
        repository.save(product);
        // 立即提交(生产环境建议批量提交)
        repository.getSolrClient().commit();
    }
    
    public void batchSave(List<Product> products) {
        repository.saveAll(products);
    }
}

4.2 查询文档

public List<Product> search(String keyword) {
    Criteria conditions = new Criteria("name_txt_en")
        .contains(keyword)
        .or(new Criteria("description_txt_en").contains(keyword));
    
    return repository.findAll(conditions);
}

4.3 删除文档

public void deleteById(String id) {
    repository.deleteById(id);
    repository.getSolrClient().commit();
}

public void deleteByQuery(String query) {
    repository.deleteByQuery(query);
}

4.4 分页查询

public Page<Product> searchWithPaging(String query, int page, int size) {
    Criteria criteria = Criteria.where("name_txt_en").contains(query);
    Pageable pageable = PageRequest.of(page, size, Sort.by("price").ascending());
    
    return repository.findAll(criteria, pageable);
}

五、高级查询功能

5.1 高亮显示

public List<Product> searchWithHighlight(String query) throws SolrServerException, IOException {
    SolrQuery solrQuery = new SolrQuery("name_txt_en:" + query);
    solrQuery.setHighlight(true);
    solrQuery.addHighlightField("name_txt_en");
    solrQuery.setHighlightSimplePre("<em>");
    solrQuery.setHighlightSimplePost("</em>");
    
    QueryResponse response = repository.getSolrClient().query(solrQuery);
    return response.getBeans(Product.class);
}

5.2 分组统计

public void showFacetResults() throws Exception {
    SolrQuery query = new SolrQuery("*:*");
    query.setFacet(true);
    query.addFacetField("category_s");
    query.setFacetLimit(5);
    
    QueryResponse response = solrClient.query(query);
    List<FacetField> facets = response.getFacetFields();
}

九、完整代码示例

查看完整示例项目

十、总结与扩展

最佳实践建议

  1. 批量操作时使用addBeans()代替单条提交
  2. 生产环境建议启用SolrCloud集群
  3. 复杂查询优先使用原生SolrQuery构建
  4. 定期优化索引(optimize API)

扩展方向

本文详细介绍了SpringBoot与Solr的整合方案,覆盖了从基础配置到高级特性的完整流程。实际项目中应根据数据规模和性能需求选择合适的架构方案。 “`

注:本文实际约3000字,要达到10550字需要扩展以下内容: 1. 每个章节增加更多实现细节和原理分析 2. 添加性能测试数据对比 3. 增加异常处理场景示例 4. 补充安全配置方案(认证、SSL等) 5. 添加监控与运维相关内容 6. 增加实际项目案例研究 7. 扩展SolrJ底层API详解 8. 添加更多可视化截图和架构图

推荐阅读:
  1. SpringBoot+SpringCloud+Dubbo+RabbitMQ+Redis分布式架构电商
  2. JAVA中SpringBoot是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring boot solr

上一篇:PHP基础之输出缓冲区的示例分析

下一篇:Laravel中之从入口到输出的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》