暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

RediSearch安装部署与实战

老王两点中 2025-04-15
1110
RediSearch 作为 Redis 的全文搜索引擎模块,结合了 Redis 的高性能和分布式架构,为企业提供了强大的搜索和分析能力。
开源地址:
    https://github.com/RediSearch/RediSearch
    一、RediSearch的安装

    安装RediSearch通常非常直接。确保你的Redis版本至少为6.0,并且支持加载Forking预览版模块。

    1. 前提条件

    确保你的系统已安装以下软件:

    • Git、Make、GCC (或其他C编译器)

    • Redis 6.0 或更高版本

    • 操作系统:支持 Linux、macOS 和 Windows(通过 WSL)。

    • 内存:至少 512 MB RAM(推荐 1 GB 以上,以支持更大数据集)。

    2. 安装方式选择

    • 源码安装

    (1) 获取Redis源码

    首先从GitHub上克隆Redis的官方仓库:

      git clone https://github.com/redis/redis.git

      sudo apt update
      sudo apt install redis-server
      (2) 获取Redisearch源码

      你需要获取Redisearch模块的源代码。有两种方法:

      • 从Redis官方仓库中直接获取。

      • 从Redis Modules页面获取独立的Redisearch仓库。

      这里假设你从Redis Modules页面获取Redisearch:

        git clone https://github.com/RediSearch/RediSearch.git


        (3) 编译Redis
        回到Redis目录,编译Redis本身:
          cd redis
          make
          (4) 编译Redisearch

          进入Redisearch目录,同样需要编译模块:

            cd RediSearch
            make
            # 生成模块路径
            ls bin/linux-x64-release/redisearch.so
            (5) 启动带有Redisearch的Redis服务器

            一旦编译完成,你可以使用以下命令启动带有Redisearch模块的Redis服务器

              ../redis/src/redis-server --loadmodule ./redisearch.so


              # 这里的redisearch.so是Redisearch模块的动态链接库文件
              # 它应该位于Redisearch的根目录下。
              (6) 测试安装

              为了验证安装是否成功,你可以尝试在Redis客户端执行一些Redisearch命令。

              打开另一个终端窗口,运行Redis客户端

                ../redis/src/redis-cli

                然后尝试创建一个索引:

                  ft.create myIndex SCHEMA title TEXT WEIGHT 1.0 body TEXT WEIGHT 0.5

                  如果命令执行成功并且没有错误消息,那么说明Redisearch已正确安装。

                  • Docker 安装
                  (1)拉取 Redisearch Docker 镜像:
                    docker pull redislabs/redisearch
                    (2)运行 Redisearch 容器:
                      # 使用官方镜像
                      docker run -p 6379:6379 redislabs/redisearch:latest
                      # 自定义配置
                      docker run -d \
                        -v my/redis.conf:/usr/local/etc/redis/redis.conf \
                        -v my/modules:/usr/lib/redis/modules \
                        redislabs/redisearch:latest \
                        redis-server usr/local/etc/redis/redis.conf \
                        --loadmodule usr/lib/redis/modules/redisearch.so
                      (3)验证安装:
                      使用以下命令检查 Redis 模块是否安装成功。出现 search 模块表示成功:
                        MODULE LIST

                        3. 注意事项

                        • 确保你在执行上述步骤时具有足够的权限。

                        • 如果你是在生产环境中部署Redisearch,请遵循最佳实践,如使用适当的防火墙规则、限制访问等。

                        • 对于不同的操作系统,编译和安装过程可能会有所不同,请参考官方文档获取适用于特定平台的指导。

                        二、核心配置参数

                        Redisearch 的配置文件是一个 JSON 格式的文件,可以放置在 Redis 的配置目录中。以下是一个简单的配置示例:

                          {
                            "redis-search": {
                              "module-path": "redis-search.so",
                              "index-pattern": "index*",
                              "index-num-shards": "3",
                              "index-num-replicas": "2",
                              "search-query-template": "{text_field}:{text_field}*{score_field}",
                              "search-query-boost-fields": {
                                "score_field": 2.0,
                                "title_field": 1.5,
                                "description_field": 1.0
                              },
                              "index-client-timeout": "5000",
                              "index-client-max-retries": "3",
                              "index-client-idle-timeout": "30000",
                              "index-client-channel-timeout": "1000",
                              "index-on-demand": false,
                              "index-concurrent-create": false,
                              "datastore": {
                                "module-path": "redis-datastore.so",
                                "nodes": [{"host": "127.0.0.1", "port": "6379"}]
                              }
                            }
                          }

                          1. 内存管理

                            # 设置最大内存限制(防止OOM)
                            FT.CONFIG SET MAXMEMORY 4GB
                            # 索引内存分配策略
                            FT.CONFIG SET ALLOCATOR_POLICY native  # 可选 jemalloc

                            2. 索引行为控制

                              # 自动索引过期时间(秒)
                              FT.CONFIG SET GC_POLICY FORK 
                              FT.CONFIG SET GC_SCAN_INTERVAL 300
                              # 停用词配置
                              FT.CONFIG SET STOPWORDS 0  # 禁用默认停用词
                              FT.CONFIG ADDSTOPWORDS the and a  # 自定义停用词

                              3. 查询优化

                                # 查询超时控制(毫秒)
                                FT.CONFIG SET TIMEOUT 5000
                                # 结果集最大条数
                                FT.CONFIG SET MAXSEARCHRESULTS 100000
                                # 模糊搜索灵敏度
                                FT.CONFIG SET FUZZY_MAX_EXPANSIONS 200

                                三、博客系统实战

                                下面通过一个博客系统,展示如何使用RediSearch创建索引、添加文档以及执行搜索操作。

                                1. 创建索引

                                我们需要创建一个索引来存储文档。每篇文章都有标题、作者以及正文内容。

                                  FT.CREATE articles SCHEMA
                                      title TEXT WEIGHT 5.0
                                      author TEXT
                                      content TEXT WEIGHT 1.0

                                  这里我们创建了一个名为articles的索引,其中包含三个字段:title、author 和 content。title 字段的权重设置为5.0,这意味着在搜索结果排序中标题的重要性高于正文内容。

                                  2. 添加文档

                                  我们可以向索引中添加一些文档。我们要添加一篇新的博客文章:

                                    FT.ADD articles doc1 1.0 FIELDS
                                        title "Understanding Redisearch"
                                        author "John Doe"
                                        content "This article explains the basics of Redisearch and how to use it effectively."

                                    这里我们使用FT.ADD命令向articles索引中添加了一篇文档,文档ID为doc1,相关性得分为1.0(这是文档的相关性得分,默认为1.0),并且定义了该文档的具体字段和内容。

                                    3. 搜索文档

                                    让我们尝试搜索这些文档。如果我们想要找到包含“Redisearch”这个词的文章:

                                      FT.SEARCH articles "@content('Redisearch')"

                                      这将返回包含关键词“Redisearch”在content字段中的所有文档。

                                      如果我们要同时根据标题和内容进行搜索:

                                        FT.SEARCH articles "@title('Understanding') @content('basics')"

                                        此命令会查找标题中包含“Understanding”并且内容中包含“basics”的文档。

                                        4. 更多高级查询

                                        Redisearch还支持更复杂的查询语法,例如使用布尔逻辑和地理位置查询。

                                        下面是一个示例,假设我们有一个包含地理位置信息的索引:

                                          FT.CREATE places SCHEMA
                                              name TEXT
                                              location GEO


                                          FT.ADD places place1 1.0 FIELDS
                                              name "Central Park"
                                              location "-73.969745,40.782915"


                                          FT.SEARCH places "@location(40.782915 -73.969745 1000 km)"

                                          在这个例子中,我们创建了一个名为places的索引,包含了地点的名字和位置坐标。然后我们添加了一个地方place1,最后我们搜索距离坐标(40.782915, -73.969745)1000公里范围内的地点。

                                          5. 案例总结

                                          通过合理配置,RediSearch可以在单节点实现10万QPS的搜索性能,在集群模式下可线性扩展至百万级QPS。
                                          建议生产环境采用以下黄金组合:
                                          • 部署架构:Redis Cluster + RediSearch分片
                                          • 持久化策略:AOF everysec + RDB每日备份
                                          • 监控体系:Prometheus + Grafana + Redis Exporter
                                          后续可根据业务需求逐步启用同义词扩展、自定义评分模型等高级功能。

                                          四、典型应用场景剖析

                                          1. 实时商品搜索系统
                                          (1)架构特征:
                                            Redis :


                                            Streams(数据源)→ RediSearch(索引)→ 客户端 ← 结果缓存(RedisJSON)
                                            (2)实现模式:
                                            • 使用Pub/Sub实现准实时索引更新(<100ms延迟)。
                                            • 结合RedisJSON存储原始文档。
                                            • 分面搜索(Faceting)实现动态聚合统计。
                                            2. 时序数据分析
                                            (1)范围查询:
                                            利用RediSearch的数值范围查询特性:
                                              FT.SEARCH metrics 
                                                  "@timestamp:[1625097600000 1625184000000] 
                                                   @value:[100 +inf] 
                                                   @tag:{servers|network}"
                                              (2)优化技巧:
                                              • 时间分片索引策略(按小时/天建立索引)。
                                              • 结合RedisTimeSeries模块进行降采样。
                                              • 使用FT.AGGREGATE进行滑动窗口统计。
                                              五、性能基准与调优实践
                                              1. 硬件资源分配策略
                                              通过cgroup实现资源隔离:
                                                # 限制RediSearch内存使用
                                                redis-cli FT.CONFIG SET MEMORY_LIMIT 4GB
                                                # 设置查询最大执行时间
                                                redis-cli FT.CONFIG SET TIMEOUT 500ms

                                                2. 索引优化参数

                                                  # 创建索引时的优化参数示例
                                                  FT.CREATE idx 
                                                      ON HASH 
                                                      PREFIX 1 "product:" 
                                                      SCHEMA 
                                                          title TEXT WEIGHT 2.0 
                                                          description TEXT 
                                                          price NUMERIC SORTABLE 
                                                          location GEO
                                                      MAXTEXTFIELDS 
                                                      STOPWORDS 10 
                                                      TEMPORARY 86400;
                                                  关键参数说明:
                                                  • SORTABLE:创建额外排序索引。
                                                  • NOOFFSETS:节省30%内存但失去高亮功能。
                                                  • STOPWORDS:自定义停用词提升效率。
                                                  3. 日常维护
                                                    # 索引碎片整理
                                                    FT.OPTIMIZE idx
                                                    # 热更新schema
                                                    FT.ALTER idx SCHEMA ADD description TEXT
                                                    # 安全删除索引
                                                    FT.DROPINDEX idx DD
                                                    六、常见问题排查
                                                    1. 模块加载失败
                                                    错误: ERR unknown command 'FT.CREATE'
                                                    解决方案:
                                                    • 检查Redis版本 ≥6.0。
                                                    • 确认模块路径权限。
                                                    • 验证模块兼容性:redis-cli MODULE LIST。
                                                    2. 查询超时
                                                    优化策略:
                                                    • 检查索引设计是否合理。
                                                    • 增加TIMEOUT值:FT.CONFIG SET TIMEOUT 10000
                                                    • 使用EXPLAINCLI分析查询计划。
                                                    通过实战案例,开发者可以更好地利用 RediSearch 解决实际问题。在性能优化方面,合理的索引设计、查询优化和分布式策略是关键。未来,随着 Redis 的不断发展,RediSearch 有望在更多领域发挥更大的作用。

                                                    文章转载自老王两点中,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                    评论