Apache Solr

Apache Solr 使用指南与配置教程

Apache Solr 是基于 Lucene 的开源企业级搜索平台,支持全文检索、分面搜索、高亮显示等功能。以下为关键操作指南:

一、安装与启动
  1. 环境准备

    • 安装 Java JDK(推荐 JDK 11+):
      sudo apt install openjdk-11-jdk  # Ubuntu/Debian
      
    • 验证安装:java -version
  2. 下载与解压 Solr

    wget https://archive.apache.org/dist/solr/solr/8.11.2/solr-8.11.2.tgz
    tar -xzf solr-8.11.2.tgz
    cd solr-8.11.2
    
  3. 启动 Solr

    bin/solr start -p 8983  # 指定端口启动
    
    • 访问管理界面:http://localhost:8983/solr
  4. 配置为系统服务(Linux)
    创建服务文件 /etc/systemd/system/solr.service

    [Unit]
    Description=Apache Solr
    After=network.target
    
    [Service]
    User=solr
    ExecStart=/opt/solr/bin/solr start -p 8983
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    

    启用服务:sudo systemctl enable solr

二、核心配置
  1. 创建核心(Core)

    bin/solr create_core -c my_core  # 创建名为 my_core 的搜索核心
    
    • 配置文件路径:server/solr/my_core/conf/
  2. 修改 schema.xml
    定义字段类型(如文本、日期)和索引规则:

    <field name="title" type="string" indexed="true" stored="true"/>
    <field name="content" type="text_general" indexed="true" stored="false"/>
    
  3. 配置中文分词
    添加 IK Analyzer 插件:

    • 下载 IK Jar 包至 server/solr-webapp/webapp/WEB-INF/lib/
    • managed-schema 中配置分词器:
      <fieldType name="text_ik" class="solr.TextField">
        <analyzer type="index">
          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
        </analyzer>
      </fieldType>
      
三、数据操作
  1. 索引数据(JSON 示例)
    通过 API 添加文档:

    curl -X POST -H 'Content-Type: application/json' \
    'http://localhost:8983/solr/my_core/update?commit=true' \
    -d '[{"id":"1", "title":"Solr指南", "content":"全文搜索配置教程"}]'
    
  2. 查询数据

    • 基础查询:
      http://localhost:8983/solr/my_core/select?q=title:指南
      
    • 分面统计:
      &facet=true&facet.field=category
      
四、常见问题解决
  1. 启动失败:端口冲突

    • 检查端口占用:lsof -i:8983
    • 更换端口:bin/solr start -p 8984
  2. 中文分词无效

    • 确认 IK Jar 包已放入正确路径
    • 重启 Solr 并重建索引
  3. 内存不足
    修改 bin/solr.in.sh

    SOLR_JAVA_MEM="-Xms2g -Xmx4g"  # 调整堆内存
    
  4. 数据未更新

    • 添加文档后执行硬提交:&commit=true
    • 或在 solrconfig.xml 中配置自动提交
五、高级功能
  • 分面搜索(Faceting):统计字段分布(如商品分类计数)
  • 高亮(Highlighting):匹配片段标红
  • 近实时搜索(NRT):索引变更秒级可见
  • 集群模式(SolrCloud):通过 ZooKeeper 管理分布式节点
思维导图

在这里插入图片描述


Apache Solr 技术原理深度解析

一、技术原理与核心架构

Solr 基于 Lucene 倒排索引实现全文搜索,其核心流程如下:

  1. 索引构建:文档经分词器处理生成词元(Token),构建词项→文档ID的映射
    倒排索引={词项i:[文档ID1,文档ID2,…]} \text{倒排索引} = \left\{ \text{词项}_i : \left[ \text{文档ID}_1, \text{文档ID}_2, \ldots \right] \right\} 倒排索引={词项i:[文档ID1,文档ID2,]}
  2. 查询处理:将查询解析为布尔逻辑(AND/OR/NOT),通过跳跃表快速定位倒排链
  3. 相关性排序:使用 BM25 算法(优于传统 TF-IDF)计算文档得分:
    score(D,Q)=∑i=1nIDF(qi)⋅f(qi,D)⋅(k1+1)f(qi,D)+k1⋅(1−b+b⋅∣D∣avgdl) \text{score}(D,Q) = \sum_{i=1}^{n} \text{IDF}(q_i) \cdot \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot (1 - b + b \cdot \frac{|D|}{\text{avgdl}})} score(D,Q)=i=1nIDF(qi)f(qi,D)+k1(1b+bavgdlD)f(qi,D)(k1+1)
    其中 k1k_1k1bbb 是可调参数,∣D∣|D|D 是文档长度
二、关键数据结构
数据结构作用实现特点
倒排索引核心搜索结构,存储词项到文档的映射使用 FST(有限状态转换机)压缩存储
DocValues列式存储,用于排序/聚合内存映射文件,减少 Heap 压力
BKD-Tree空间数据索引(如经纬度)高效多维范围查询
跳跃表加速倒排链的交并集操作O(log n) 时间复杂度
三、核心组件功能
  1. 分词器(Tokenizer)
    • 将文本拆分为词元(支持中文 IKAnalyzer)
    • 示例流程:"Solr搜索" → ["solr", "搜索"]
  2. 过滤器(Filter)
    • 词元处理:小写转换、同义词扩展、停用词过滤
  3. 查询解析器(QueryParser)
    • 解析 title:("大数据" AND "分析")~10 等复杂语法
  4. 请求处理器(RequestHandler)
    • 路由请求到搜索/更新等操作模块
  5. SolrCloud 协调器
    • 基于 ZooKeeper 实现分布式共识和故障转移
四、优缺点分析

优势

  1. 全文检索精度高(支持短语搜索、模糊匹配)
  2. 实时性优秀(NRT 近实时搜索延迟<1s)
  3. 扩展性强(支持 PB 级分布式集群)
  4. 功能丰富(分面统计、高亮、拼写检查)

局限

  1. 内存消耗较大(建议 16GB+ 内存)
  2. 聚合分析弱于 Elasticsearch
  3. 学习曲线陡峭(需掌握 Lucene 底层原理)
五、Java 示例代码(含中文注释)
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.params.MapSolrParams;

import java.util.HashMap;
import java.util.Map;

public class SolrSearchDemo {
    public static void main(String[] args) throws Exception {
        // 1. 创建Solr客户端(指向核心my_core)
        String solrUrl = "http://localhost:8983/solr";
        try (SolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build()) {
            String coreName = "my_core";
            
            // 2. 构建查询参数
            Map<String, String> queryParams = new HashMap<>();
            queryParams.put("q", "content:分布式系统");  // 查询内容包含"分布式系统"
            queryParams.put("fl", "id,title,score");    // 返回字段:ID、标题、相关性得分
            queryParams.put("fq", "category:IT");        // 过滤条件:IT分类
            queryParams.put("sort", "score desc");       // 按相关性降序
            queryParams.put("rows", "10");               // 返回前10条结果
            
            // 3. 执行查询并获取响应
            QueryResponse response = solrClient.query(coreName, new MapSolrParams(queryParams));
            SolrDocumentList results = response.getResults();
            
            // 4. 遍历结果
            System.out.println("命中文档数: " + results.getNumFound());
            results.forEach(doc -> {
                System.out.println("ID: " + doc.get("id") 
                    + " | 标题: " + doc.get("title") 
                    + " | 得分: " + doc.get("score"));
            });
        }
    }
}

关键代码注释

  • HttpSolrClient:HTTP 协议客户端,连接 Solr 服务器
  • MapSolrParams:封装查询参数(q=关键词,fl=返回字段)
  • fq 参数:过滤查询(Filter Query),不影响相关性评分
  • score 字段:BM25 算法计算的相关性得分(值越大越匹配)
六、性能优化建议
  1. 索引优化
    • 使用 docValues=true 加速排序/聚合
    • 避免存储不必要字段(stored="false"
  2. 查询优化
    • fq 替代 q 进行过滤(结果可缓存)
    • 避免通配符前缀查询 *term
  3. JVM 调优
    # solr.in.sh 配置
    SOLR_JAVA_MEM="-Xms4g -Xmx8g"  # 堆内存设置
    GC_TUNE="-XX:+UseConcMarkSweepGC" # 低延迟GC
    
思维导图

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值