Redis 扩展模块 -- RediSearch 的安装方法

摘要

RediSearch 简介

  • RediSearch 是 Redis 官方推出的 全文搜索二级索引模块,用于在 Redis 之上提供类似搜索引擎的能力,解决“只能按 key 查、无法高效按字段查询”的问题。它是 Redis Stack 的核心组件之一,常用于搜索、过滤、排序和聚合场景。仅支持对 Hash 和 RedisJSON 类型进行索引。

  • 该模块以 Redis Module 方式加载,可无缝集成到现有 Redis 实例中。

  • Redis8+,RediSearch 已经内置在 Redis 中,可以在安装redis同时安装全部 Stack 模块。

  • RediSearch 通过 索引结构 + 查询语言,提供:

    • 全文搜索(Text Search)
    • 二级索引(按字段查询)
    • 多条件过滤 / 排序
    • 聚合分析(GROUP BY、COUNT、SUM 等)
  • 性能与设计特点

    • 索引在内存中,查询延迟低(毫秒级)
    • 写入时同步更新索引(写入成本略高)
    • 适合 读多写少 / 查询复杂 的业务
    • 非事务型搜索引擎(不替代 ES,而是互补)
  • 与原生 Redis 的对比

维度 Redis 原生 RediSearch
查询方式 key 精确 多字段查询
全文搜索 不支持 支持
范围查询 有限
聚合统计 基本没有 类 SQL
性能 极快 近实时,内存换性能

RediSearch vs Elasticsearch

对比点 RediSearch Elasticsearch
部署复杂度
延迟 极低 较高
数据规模 中小规模 超大规模
实时性 近实时
场景 业务内搜索 搜索平台

安装 RediSearch

  • 最简单的方式就是从Redis CloudDownload Center中进行下载,其提供了所有Redis模块编译后的.so文件,可以优先进行尝试,但是并不保证一定兼容,所以最稳妥的方式是通过源码自己编译。

  • 源码编译

安装时需要科学上网,主要是安装依赖时需要从海外网下载,如果要部署在国内服务器,可能会连接失败。
可以在海外的相同配置的服务器上进行编译,之后将编译好的redisearch.so上传到国内服务器即可。

  • 安装依赖

1
2
3
4
5
6
7
8
9
10
11
12
sudo dnf install -y \
gcc \
gcc-c++ \
make \
cmake \
autoconf \
automake \
libtool \
pkgconfig \
openssl-devel \
libstdc++ \
libstdc++-devel
  • RediSearch 最新版本 依赖 CMake 3.25+,dnf源中的版本较低,所以这里需要手动安装

1
2
3
4
5
6
7
8
9
10
11
12
13
CMAKE_VERSION=3.25.1

cd /usr/local/src
wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}.tar.gz
tar -xf cmake-${CMAKE_VERSION}.tar.gz
cd cmake-${CMAKE_VERSION}

./bootstrap --prefix=/usr/local
make -j$(nproc)
sudo make install

# 验证版本 /usr/local/bin/cmake
/usr/local/bin/cmake --version
  • 编译RediSearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mkdir -p /usr/local/soft/modules/
cd /usr/local/soft/modules
# clone 代码,这里 --recursive 是为了拉取子模块
git clone --recursive https://github.com/RediSearch/RediSearch.git
cd RediSearch
# 推荐切换到稳定的release版本
git checkout v2.10.25
# 更新子模块,非必须,如果上面 clone 时没有加上 --recursive ,这个步骤就不能省略
git submodule update --init --recursive

# 创建 build_dir 目录,编译失败要先删除该目录在重新创建
mkdir build_dir && cd build_dir
# 生成 Makefile
/usr/local/bin/cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++


# 编译 RediSearch
make -j$(nproc)
# 编译过程会报错,同样在 Rocky9 上也会遇到这个问题
[100%] Linking CXX shared library redisearch.so
/usr/bin/ld: cannot find -lstdc++: No such file or directory
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/redisearch.dir/build.make:557: redisearch.so] Error 1
make[1]: *** [CMakeFiles/Makefile2:2958: CMakeFiles/redisearch.dir/all] Error 2
make: *** [Makefile:136: all] Error 2
  • 编译错误原因分析

1
RediSearch 2.10.x 在链接 redisearch.so 时 强制 使用 -static-libstdc++,而 libstdc++.a 静态文件不存在,导致编译失败
  • 解决方法是安装静态库

1
2
3
4
5
sudo dnf install -y libstdc++-static
# 验证静态文件是否存在
ls /usr/lib/gcc/x86_64-amazon-linux/*/libstdc++.a
# 输出
/usr/lib/gcc/x86_64-amazon-linux/11/libstdc++.a
  • 安装后重新编译RediSearch

1
2
3
4
5
6
7
8
9
10
11
12
13
cd /usr/local/soft/modules
# 删除 build_dir 目录
rm -rf build_dir
# 创建 build_dir 目录,编译失败要先删除该目录再重新创建
mkdir build_dir && cd build_dir
# 生成 Makefile
/usr/local/bin/cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++

# 编译 RediSearch,如果没有错误,则说明编译成功,输出: build_dir/redisearch.so
make -j$(nproc)

Redis 启用模块

  • 将生成的 redisearch.so 拷贝到 redis 的 modules 目录下(非必须),目录不存在则创建

1
2
# 注意 .so 文件需要包含可执行权限
cp build_dir/redisearch.so /usr/local/soft/redis-7.4.7/modules/redisearch.so
  • 本文采用 loadmodule 加载模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 将 redisearch.so 添加到 redis.conf 中,需要重启 redis
loadmodule /usr/local/soft/redis-7.4.7/modules/redisearch.so

# 启动redis
redis-server redis.conf

# 登录测试
redis-cli --user admin --pass 123456
# 查看模块
127.0.0.1:6379> MODULE LIST
# 输出
1) 1) "name"
2) "ReJSON"
3) "ver"
4) (integer) 20816
5) "path"
6) "/usr/local/soft/redis-7.4.7/modules/rejson.so"
7) "args"
8) (empty array)
2) 1) "name"
2) "bf"
3) "ver"
4) (integer) 20817
5) "path"
6) "/usr/local/soft/redis-7.4.7/modules/redisbloom.so"
7) "args"
8) (empty array)
3) 1) "name"
2) "search"
3) "ver"
4) (integer) 21025
5) "path"
6) "/usr/local/soft/redis-7.4.7/modules/redisearch.so"
7) "args"
8) (empty array)

Rocky9 编译安装 RediSearch

系统版本:Rocky Linux release 9.4 (Blue Onyx)

  • 安装依赖

1
2
3
4
5
6
7
8
9
10
11
12
sudo dnf install -y \
gcc \
gcc-c++ \
make \
cmake \
autoconf \
automake \
libtool \
pkgconfig \
openssl-devel \
libstdc++ \
libstdc++-devel
  • 启用 CRB

在 Rocky Linux 9 中,libstdc++-static 不在默认仓库里,它位于 CRB(CodeReady Builder)仓库,默认是 关闭的,所以我们需要先启用它

1
2
3
4
5
6
# 如果你系统里没有 config-manager,需要先先装
sudo dnf install -y dnf-plugins-core
# 启用 CRB
sudo dnf config-manager --set-enabled crb
# 刷新缓存
sudo dnf makecache
  • 安装静态库,解决/usr/bin/ld: cannot find -lstdc++: No such file or directory的问题

1
2
3
sudo dnf install -y libstdc++-static
# 验证静态文件是否存在
ls /usr/lib/gcc/x86_64-redhat-linux/*/libstdc++.a
  • 编译RediSearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mkdir -p /usr/local/soft/modules/
cd /usr/local/soft/modules
# clone 代码,这里 --recursive 是为了拉取子模块
git clone --recursive https://github.com/RediSearch/RediSearch.git
cd RediSearch
# 推荐切换到稳定的release版本
git checkout v2.10.25
# 更新子模块,非必须,如果上面 clone 时没有加上 --recursive ,这个步骤就不能省略
git submodule update --init --recursive

# 创建 build_dir 目录,编译失败要先删除该目录再重新创建
mkdir build_dir && cd build_dir
# 生成 Makefile
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++

# 编译 RediSearch,如果没有错误,则说明编译成功,输出: build_dir/redisearch.so
make -j$(nproc)