《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Solr/install/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

Apache Solr 是一个开源的、高性能、使用 Java 语言实现的搜索服务器,可以实现全文检索的功能。Solr 提供 HTTP 接口JSON 数据格式传输,方便不同开发语言的开发者接入。

Solr 是在 Apache Lucene 的基础上进行拓展,提供了比 Lucene 更丰富的查询语句,更好的查询性能。并且,Solr 自带了一个功能完善的管理界面

友情提示:实际上,Solr 和 Lucene 是在一个 Github 仓库下 https://github.com/apache/lucene-solr,已经不分彼此了。

Solr 是以 Document 为对象进行存储,每个 Document 由一系列的 Field 组成,而每个 Field 表示一个属性。和数据库的表记录一样,每个 Document 需要有一个唯一标识,默认情况下使用 id 属性。

友情提示:胖友可以把 Document 和数据库的表记录等价。

Solr 实现全文检索的功能,主要涉及两个流程:

  • 索引流程:向 Solr 发起 POST 请求,请求内容是包含一系列 Field 的 Document,实现对索引增删该的维护。
  • 搜索流程:向 Solr 发起 GET 请求,请求内容是查询条件,返回匹配条件的 Document。

友情提示:😈 这里流程只是简单描述,实际会有分词等等复杂的细节。

2. 单机部署

本小节,我们来最小化部署一个 Solr 服务,适合演示学习测试环境之用。

① 访问 https://lucene.apache.org/solr/downloads.html 地址,进入 Solr 的下载界面。如下图所示:

下载界面

这里,我们下载 Solr 的二进制发布版本。执行命令如下:

# 执行下载,180M 多,有点大哈~
$ wget https://mirror.bit.edu.cn/apache/lucene/solr/8.5.2/solr-8.5.2.tgz

# 解压
$ tar -zxvf solr-8.5.2.tgz
$ cd solr-8.5.2

# 打印目录
$ ls -ls
1800 -rw-r--r-- 1 yunai staff 919554 May 19 09:57 CHANGES.txt
32 -rw-r--r-- 1 yunai staff 12646 May 19 09:57 LICENSE.txt
1472 -rw-r--r-- 1 yunai staff 750016 May 19 09:57 LUCENE_CHANGES.txt
56 -rw-r--r-- 1 yunai staff 27944 May 19 09:57 NOTICE.txt
16 -rw-r--r-- 1 yunai staff 7490 May 19 09:57 README.txt
0 drwxr-xr-x 11 yunai staff 352 May 19 09:57 bin # 脚本命令目录
0 drwxr-xr-x 12 yunai staff 384 May 20 02:23 contrib
0 drwxr-xr-x 18 yunai staff 576 Jun 17 21:21 dist # Solr 发布包
0 drwxr-xr-x 4 yunai staff 128 Jun 17 21:21 docs # 文档
0 drwxr-xr-x 7 yunai staff 224 May 19 09:57 example # 示例代码
0 drwxr-xr-x 607 yunai staff 19424 May 19 09:57 licenses
0 drwxr-xr-x 12 yunai staff 384 May 20 02:22 server # Solr 服务器

② 执行 bin/solr start 命令,进行 Solr 服务的启动。当看到 Started Solr server on port 8983 (pid=14133). Happy searching! 日志内容,说明启动成功。

默认配置下,Solr 启动在 8983 端口,所以可以使用浏览器访问 http://127.0.0.1:8983/solr/ 地址,看到 Solr 管理界面。如下图所示:

Solr 管理界面

3. 简单使用

本小节,我们来简单使用 Solr,进一步的了解,嘿嘿~

3.1 创建 Core

Solr 的管理以 Core 为基本单元,每个 Core 里面都有其配置文件、索引文件。

下面,我们来点击 Solr 管理界面的「Core Admin」菜单,创建一个 Core 来测试测试。如下图所示:

Solr 管理界面 —— Core Admin

因为我们未创建该 Core 相关的目录和配置,所以会报 Error 错误。下面,我们先进行创建。

② 创建 new_core 目录,执行如下命令:

# 进入 Solr 服务器的基础目录
$ pwd
/Users/yunai/Solr/solr-8.5.2
$ cd server/solr

# 默认 new_core 目录已经存在,无需创建
$ ls
README.txt configsets filestore new_core solr.xml userfiles zoo.cfg

`new_core` 目录

② 将上图 configsets/_default/conf 目录下的所有配置文件,拷贝到 new_core 目录下,它是 Solr 推荐的默认配置。如下图所示:

`configsets/_default/conf` 目录

③ 重新点击 Solr 控制台的「Add Core」按钮,即可完成 Core 的创建。如下图所示:

Solr 管理界面 —— Core Admin —— 创建成功

友情提示:写完本文才发现,原来可以直接执行 bin/solr create -c {CORE_NAME} 命令,创建一个指定名字的 CORE。

例如说,执行 bin/solr create -c new_core 命令,就创建了一个名字为 new_core 的 Core。简单直接~

3.2 新增 Document

① 选择刚创建的 Core,然后点击「Documents」菜单,进入新增 Document 的界面。如下图所示:

Solr 管理界面 —— Core Admin —— 新增 Document

② 在 Document(s) 输入框中,输入如下 JSON 数据,进行一个 Document 的新增。如下图所示:

Solr 管理界面 —— Core Admin —— 新增 Document(示例)

{
"id": 1,
"name": "测试数据"
}

胖友可以自己再造几个 Document 测试数据,因为稍后要演示查询 Document 的功能。

3.3 查询 Document

① 点击「Query」菜单,进入查询 Document 的界面。如下图所示:

Solr 管理界面 —— Core Admin —— 查询 Document

② 在「q」输入框中填写 id:1,查询编号为 1 的 Document。如下图所示:

Solr 管理界面 —— Core Admin —— 查询 Document(示例)

3.4 管理 Schema

① 点击「Schema」菜单,进入 Schema 的管理界面。如下图所示:

Solr 管理界面 —— Core Admin —— 管理 Schema

通过 Schema 我们可以定义 Document 中,每一个 Field 的配置。如果类比数据库的话,Schema 就是数据库表结构。

② 选择 Field name,查看其具体的配置。如下图所示:

Solr 管理界面 —— Core Admin —— 管理 Schema(示例)

我们来看看图中红圈的每列字段代表的含义:

  • Indexed:是否索引。被索引的 Field 在搜索的时候,可以使用它来查询或者排序。在 Lucene 中,被索引的 Field 会建立倒排索引。
  • Stored:是否存储。一个 Field 被存储时,在 Solr 的查询结果获得到它。如果设置为存储,它会消耗 CPU、IO、磁盘等资源。
  • Multivalued:是否可以存储多个值。也就是说,这个 Field 是否为 [] 数组。
  • Tokenized:是否进行分词。
  • UnInvertible:是否可逆。

4. 应用接入

参考《芋道 Spring Boot Solr 入门》文章,在 Spring Boot 项目中,基于 Solr 实现搜索功能。

5. 中文分词

在 Solr 中,我们一般采用 Ik-analyzer 进行分词。

胖友可以参考《Solr8 集成 Ik-analyzer 分词》文章,将 Ik-analyzer 集成到 Solr 当中。

6. 数据导入

Solr 支持将 MySQL 等数据库中,导入到索引中。

胖友可以参考《Solr 8.2 使用指南》文章,进行数据导入的操作。

666. 彩蛋

暂时木有彩蛋,嘿嘿~

文章目录
  1. 1. 1. 概述
  2. 2. 2. 单机部署
  3. 3. 3. 简单使用
    1. 3.1. 3.1 创建 Core
    2. 3.2. 3.2 新增 Document
    3. 3.3. 3.3 查询 Document
    4. 3.4. 3.4 管理 Schema
  4. 4. 4. 应用接入
  5. 5. 5. 中文分词
  6. 6. 6. 数据导入
  7. 7. 666. 彩蛋