dot Redis 8 已发布——并且是开源的

了解更多

RediSearch 2.0 达成其首个里程碑

我们很高兴宣布 RediSearch 2.0 开发的首个里程碑版本发布。RediSearch 是一款实时搜索引擎,可让您查询 Redis 数据以回答各种复杂问题。 

这个里程碑版本,被称为 2.0-M01,标志着索引与数据保持同步方式的重新架构。现在,RediSearch 将不再需要通过索引写入数据(使用 FT.ADD 命令),而是跟随写入 hashes 的数据并自动对其进行索引。  

这里最大的优势在于,您现在可以将 RediSearch 添加到现有的 Redis 实例中,并在无需更新应用程序代码的情况下创建辅助索引。这样,您只需加载 RediSearch 模块并定义 schema,就可以立即开始在现有数据上使用 RediSearch。RediSearch 2.0 的正式发布预计在今年秋季。 

(注意:这项新功能对API 引入了一些更改(如下所列)。我们尽量保持向后兼容性,但在这种情况下确实不可能。我们计划在收集客户反馈后进行调整和修复。)

RediSearch 2.0 里程碑版本的架构。

API 变更

如上所述,此 RediSearch 2.0 里程碑版本包含多项 API 变更:  

  1. 索引不再存在于键空间中。例如,如果您曾使用索引键 (idx:<index name>) 来列出数据库中的索引,这将不再有效。但是,我们引入了一个命令 FT._LIST 来返回数据库中的所有索引。
  2. 必须使用 prefix/filter 创建索引。这些指定了哪些文档将由 RediSearch 自动索引。您可以指定一个简单的 prefix 和/或一个复杂的 filter 表达式。
  3. 无法升级。如果您有使用旧版 RediSearch 创建的 RDB 文件,RediSearch 2.0 将无法读取。目前,您必须重新索引整个数据集。不过,我们正在为 GA(正式发布)版本开发升级流程。
  4. 仅支持 Redis 6 及以上版本。
  5. FT 命令已映射到其 Redis 等效命令。这使得现有应用程序仍可与 RediSearch 2.0 配合使用。映射如下:
    1. FT.ADD => HSET
    2. FT.DEL => DEL (默认 DD)
    3. FT.GET => HGETALL
    4. FT.MGET => HGETALL
  6. 倒排索引本身不再保存到 RDB。这并不意味着不支持持久化。RediSearch 会将索引定义保存到 RDB,并在 Redis 启动后在后台对数据进行索引。您可以使用 FT.INFO 命令检查索引状态,以了解何时完成重新索引。

新 API

API 的最大更新是索引的创建方式。在 RediSearch 2.0 中,使用命令 FT.CREATE 创建索引。API 的新增内容已在此处用黄色突出显示

FT.CREATE {index}
    ON {structure} 
     [PREFIX {count} {prefix} [{prefix} ..]
     [FILTER {filter}]
     [LANGUAGE_FIELD {lang_field}]
     [LANGUAGE {lang}]
     [SCORE_FIELD {score_field}]
     [SCORE {score}]
     [PAYLOAD_FIELD {payload_field}]
   [TEMPORARY {seconds}] 
   [MAXTEXTFIELDS]
   [NOOFFSETS] [NOHL] [NOFIELDS] [NOFREQS]
   [STOPWORDS {num} {stopword} ...]
   SCHEMA {field} [TEXT [NOSTEM] [WEIGHT {weight}] [PHONETIC {matcher}] | NUMERIC | GEO | TAG [SEPARATOR {sep}] ] [SORTABLE][NOINDEX] ...

让我们深入了解一些细节

  • ON {structure} 当前仅支持 HASH
  • PREFIX {count} {prefix} 告诉索引应该索引哪些键。您可以添加多个 prefix 进行索引。由于此参数是可选的,默认值为 * (所有键)
  • FILTER {filter} 是一个过滤表达式,支持完整的 RediSearch 聚合表达式语言。可以使用 @__key 访问刚刚添加/更改的键
  • LANGUAGESCORE 允许您覆盖所有索引文档的默认语言和 score
  • LANGUAGE_FIELDSCORE_FIELDPAYLOAD_FIELD 允许您拥有文档特定的语言和 scoring,并将 payload 用作文档内的字段。

其他限制和变更

RediSearch 2.0-M01 里程碑版本还带来了一些其他更新

  • NOSAVE 不再支持。
  • 更新 hashes 意味着整个文档将被索引(keyspace 通知无法告知哪些字段发生了更改)。因此,部分更新会较慢。请注意,我们仍在研究改进这些情况下性能的方案。
  • 字段名现在区分大小写,因此声明一个字段“FOO”并将其索引为“foo”将无效。
  • FT.ADD 命令将映射到 hset,如下所示

FT.ADD idx doc1 1.0 LANGUAGE eng PAYLOAD payload FIELDS f1 v1 f2 v2

映射到

HSET doc1 __score 1.0 __language eng __payload payload f1 v1 f2 v2

这意味着您索引上的 score、language 和 payload 字段必须分别命名为 __score、__language 和 __payload,才能使映射按预期工作。

  • FT.ADDHASH 不再支持。请使用 HSET
  • FT.OPTIMIZE 不再支持,索引优化由 RediSearch 的 Garbage Collection 功能负责。

结论

我们对这些变化感到非常兴奋,因为您现在可以将 RediSearch 加载到现有的 Redis 数据库中,并对存在于 hashes 中的现有数据进行索引,而无需在操作这些文档时更新应用程序逻辑。  您可以通过从 GitHub 获取源代码或使用 1:99:1RedisSarch Docker 镜像来试用这个里程碑版本。此版本尚未达到生产就绪状态,但我们希望现在就与您分享,以收集您的反馈。请在我们的 GitHub 仓库 或在 Redis 社区论坛 分享任何评论或问题。