solr详解

一、Solr是什么?

Solr 是一个开源的企业级搜索平台,基于 Apache Lucene 构建。它能高效地进行全文检索、数据分析,并且支持分布式部署,广泛应用于网站、日志分析、电子商务等领域。


二、核心功能

  1. 全文检索
    支持复杂的关键词搜索、分词、短语匹配、高亮、模糊查询等。

  2. 分面搜索(Faceted Search)
    可以对搜索结果进行分类统计,如按品牌、价格区间等。

  3. 高可扩展性
    支持分布式索引和查询(SolrCloud),适合海量数据。

  4. 丰富的数据格式支持
    支持 XML、JSON、CSV 等多种数据格式。

  5. RESTful API
    通过 HTTP 协议进行数据的增删查改,易于集成。

  6. 高性能缓存
    内置缓存机制,提高查询速度。

  7. 高亮显示
    查询结果可以高亮显示匹配的关键词。

  8. 地理空间搜索
    支持地理位置相关的检索。


三、Solr架构

1. Solr核心组件

  • 索引(Index):数据存储与检索的基础。
  • Schema:定义字段类型、分词方式等。
  • 请求处理器(Request Handler):处理各种查询请求。
  • 分析器(Analyzer):分词、过滤等文本处理。
  • SolrCloud:分布式架构,支持高可用、负载均衡。

2. 部署模式

  • 单节点模式:适合小规模应用。
  • SolrCloud模式:多节点分布式部署,适合大规模、海量数据。

四、Solr与Lucene的关系

  • Lucene 是底层的搜索库,负责实现索引和检索算法。
  • Solr 基于 Lucene,提供了更友好的 REST API、管理界面、分布式能力等。

五、基本使用流程

  1. 定义 Schema
    配置字段、分词器、过滤器等。

  2. 数据导入(Indexing)
    通过 API 或工具将数据写入 Solr。

  3. 查询(Searching)
    通过 REST API 发起查询请求,支持多种查询方式。

  4. 结果处理
    支持高亮、分面、排序等。


六、典型应用场景

  • 网站搜索(如商品、文章检索)
  • 日志分析
  • 电子商务平台
  • 企业文档管理
  • 数据分析与报表

七、Solr与Elasticsearch对比

特性SolrElasticsearch
底层引擎LuceneLucene
APIRESTfulRESTful
分布式能力SolrCloud内置分布式
配置方式XML 配置JSON/YAML 配置
管理界面内置 Admin UIKibana(需单独部署)
社区活跃度较高非常高

八、Solr常用命令与操作

  1. 启动 Solr
    bin/solr start
    
  2. 创建 Collection
    bin/solr create -c my_collection
    
  3. 添加文档
    curl http://localhost:8983/solr/my_collection/update?commit=true \
      -H "Content-Type: application/json" \
      -d '[{"id":"1","title":"Solr 入门教程"}]'
    
  4. 查询文档
    curl "http://localhost:8983/solr/my_collection/select?q=title:Solr"
    

九、Solr核心配置文件详解

1. solr.xml

  • 位于 Solr 安装目录下,定义整体 Solr 实例的配置,如核心(Core)管理、SolrCloud 配置等。

2. schema.xml 或 managed-schema

  • 定义 collection/核心的字段、字段类型、分词器、过滤器等。
  • 字段类型:如 text_generalstringint 等。
  • 分词器(analyzer):指定分词方式(如 IKAnalyzer、StandardTokenizer)。
  • 过滤器(filter):用于去除停用词、大小写转换、同义词处理等。

3. solrconfig.xml

  • 控制核心的行为,如请求处理器(RequestHandler)、缓存设置、日志、索引合并策略等。
  • 例:定义 /select 查询接口、更新接口、分面查询等。

二、分词器与分析器

1. 分词器(Tokenizer)

  • 将文本切分为单独的词语。
  • 常用分词器:StandardTokenizer(英文)、IKAnalyzer(中文)。

2. 过滤器(Filter)

  • 对分词结果进一步处理,如去除停用词、词干提取、同义词扩展等。

3. 分析器(Analyzer)

  • 包含分词器和一系列过滤器,决定了字段的索引和查询方式。

示例:中文分词配置

<fieldType name="text_ik" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" />
  </analyzer>
</fieldType>

十、SolrCloud分布式架构

1. 主要概念

  • Collection:逻辑上的索引集合。
  • Shard:分片,每个 Collection 可分为多个 Shard。
  • Replica:副本,每个 Shard 可有多个副本,提高高可用性。
  • ZooKeeper:负责集群状态管理和节点协调。

2. 架构特点

  • 高可用:任一节点挂掉,副本可继续服务。
  • 可扩展:动态增加节点和分片,支持数据水平扩展。
  • 负载均衡:查询和索引请求自动分发到各个节点。

3. 部署步骤简述

  1. 部署 ZooKeeper 集群(至少 3 台)。
  2. 启动 Solr 节点,连接 ZooKeeper。
  3. 创建 Collection 时指定分片和副本数。
    bin/solr create_collection -c my_collection -shards 2 -replicationFactor 2
    

十一、性能优化建议

  1. 合理分片与副本

    • 根据数据量和查询压力选择分片数和副本数。
  2. 字段类型与分词优化

    • 不需要分词的字段用 string 类型,节省空间和计算。
  3. 缓存配置

    • 利用 solrconfig.xml 配置查询缓存、过滤器缓存等。
  4. 硬件优化

    • SSD 硬盘、充足内存、合理的 CPU 分配。
  5. 合并与压缩

    • 定期合并小索引段,减少碎片,提高查询效率。
  6. 只索引必要字段

    • 减少不必要的字段索引,降低索引体积。

十二、常见问题与解决方案

1. 分词效果不佳

  • 检查分词器配置,中文建议使用 IKAnalyzer 或 HanLP。
  • 测试分词结果,调整停用词、同义词库。

2. 查询慢

  • 检查缓存配置,增加缓存容量。
  • 优化 schema,减少分词字段数量。
  • 增加副本数,分担查询压力。

3. 索引膨胀

  • 定期合并索引段。
  • 只索引必要字段,减少存储。
  • 使用压缩存储。

4. 集群不稳定

  • 检查 ZooKeeper 状态,保证集群节点数量和稳定性。
  • 合理配置分片和副本,避免单点故障。

十三、实战案例简述

1. 电商商品检索

  • 用于商品名称、描述的全文检索。
  • 支持分面查询:品牌、价格区间、分类等。
  • 支持高亮和排序。

2. 日志检索

  • 将日志数据(如 Apache、Nginx)实时写入 Solr。
  • 支持时间区间、关键字、IP 地址等多维度查询。

3. 企业文档管理

  • 支持文档全文检索、分类、标签分面。
  • 支持文档内容高亮显示。

十四、学习与扩展资源

  • Solr 官方文档
  • 开源分词器:IKAnalyzer、HanLP
  • 《Lucene in Action》、Solr 实战相关书籍
  • GitHub 搜索相关项目

十五、Solr高级功能

1. 分面搜索(Faceting)

分面搜索可以对结果进行分类统计,常用于电商、内容管理等领域。

常见分面类型:

  • 字段分面(Field Facet):统计某字段各值的数量,如品牌、分类。
  • 查询分面(Query Facet):按指定条件统计,如价格区间。
  • 范围分面(Range Facet):对数值或日期区间统计,如按价格或时间分段统计。

分面查询示例:

http://localhost:8983/solr/my_collection/select?q=手机&facet=true&facet.field=brand&facet.range=price&facet.range.start=1000&facet.range.end=5000&facet.range.gap=1000

2. 高亮显示(Highlighting)

Solr 可以对查询命中的关键词进行高亮显示,便于用户定位。

高亮查询示例:

http://localhost:8983/solr/my_collection/select?q=title:Solr&hl=true&hl.fl=title

3. 排序与过滤

支持多字段排序、复杂过滤条件。

  • 排序:sort=price desc
  • 过滤:fq=category:手机

4. 同义词、拼写纠错

  • 同义词扩展:通过配置同义词文件,实现“手机”和“移动电话”检索一致。
  • 拼写纠错:配置 SpellCheck 组件,自动纠正用户输入错误。

5. 地理空间检索(Spatial Search)

支持按地理坐标进行范围检索,非常适合地图、LBS 应用。

示例:

http://localhost:8983/solr/my_collection/select?q=*:*&fq={!geofilt pt=31.2304,121.4737 sfield=location d=10}

表示查找距离上海市中心10公里以内的数据。


十六、典型配置案例

1. schema.xml/managed-schema 字段配置示例

<field name="id" type="string" indexed="true" stored="true" required="true"/>
<field name="title" type="text_ik" indexed="true" stored="true"/>
<field name="brand" type="string" indexed="true" stored="true"/>
<field name="price" type="float" indexed="true" stored="true"/>
<field name="location" type="location" indexed="true" stored="true"/>

2. solrconfig.xml 请求处理器配置

<requestHandler name="/select" class="solr.SearchHandler">
  <lst name="defaults">
    <str name="echoParams">explicit</str>
    <int name="rows">10</int>
  </lst>
</requestHandler>

十七、Solr与其他系统集成

1. 与数据库集成

  • 可用 Data Import Handler(DIH)定时从 MySQL、Oracle、SQL Server 抓取数据自动同步索引。
  • 支持 JDBC、CSV、XML 数据源。

DIH 配置示例:

<dataConfig>
  <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/db" user="root" password="xxx"/>
  <document>
    <entity name="product" query="SELECT id, title, price FROM product"/>
  </document>
</dataConfig>

2. 与消息队列集成

  • 可通过 Kafka、RabbitMQ 等,将数据实时推送到 Solr(常用于日志、实时数据)。

3. 与大数据平台集成

  • 支持与 Hadoop、Spark 等大数据平台集成,实现大规模数据索引和检索。

十八、运维与监控

1. 集群监控

  • Solr 自带 Admin UI,可查看索引大小、查询延迟、节点状态等。
  • 可集成 Prometheus、Grafana 实现指标可视化。

2. 备份与恢复

  • 利用 Solr 的 snapshot 功能定期备份索引数据。
  • 支持异地恢复,保障数据安全。

3. 日志与报警

  • 配置日志级别,监控错误、慢查询等。
  • 可与 ELK(Elasticsearch+Logstash+Kibana)集成,收集 Solr 日志。

十九、常见运维命令

  • 启动/停止 Solr:bin/solr start / bin/solr stop
  • 查看节点状态:bin/solr status
  • 创建/删除 collection:bin/solr create_collection -c test / bin/solr delete -c test
  • 索引优化:bin/post -c test data.json(可定期合并小段)

二十、最佳实践建议

  1. 字段设计:只索引必要字段,合理选择字段类型。
  2. 分词优化:针对业务场景调整分词器和停用词。
  3. 分片副本:根据数据量和查询压力合理分片、增加副本。
  4. 监控报警:集群状态、查询性能、硬件资源都需实时监控。
  5. 安全加固:生产环境建议开启认证、访问控制。
    本课程全程使用目前比较流行的开发工具idea进行开发,涉及到目前互联网项目中最常用的高并发解决方案技术, 如dubbo,redis,solr,freemarker,activeMQ,springBoot框架,微信支付,nginx负载均衡,电商活动秒杀,springSecurity安全框架,FastDFS分布式文件服务器,还会涉及到代码生成器,   前台的技术有angularJS和BootStrap框架,此课程内容丰富实战性强,如果你还是传统项目的开发人员,那你学完本课程会有很大的收获,让你的薪资上涨,5K以上,让你完全感受到了互联网思维带来的高 并发解决方案的思路,如果你是开发的小白,建议你学完Spring,SpringMVC,MyBatis框架后再来学习本门课程,学完以后会让你完全体验到企业级开发的流程.在职开发人员学完后会让你的薪资更高,让你更了解互联网是如何解决高并发 学完SSM框架的同学就可以学习,能让你切身感受到企业级开发环境目标1:完成solr环境安装、中文分析器和业务域的配置目标2:会使用Spring Data Solr完成增删改查操作目标3:完成批量数据导入功能目标4:完成按关键字搜索功能目标5:实现考拉易购搜索结果高亮显示功能目标6:说出考拉易购搜索的业务规则和实现思路目标7:完成查询分类列表的功能目标8:完成缓存品牌和规格数据的功能目标9:完成显示品牌和规格数据的功能目标10:完成过滤条件构建的功能目标11:完成过滤查询的功能目标11:实现考拉易购价格区间筛选功能目标12:实现搜索结果分页功能目标13:理解多关键字搜索目标14:实现搜索结果排序功能目标15:实现隐藏品牌列表功能目标16:实现搜索页与首页对接功能目标17:完成更新索引库的功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值