dot 快速的未来即将在您所在的城市举办的活动中实现。

加入我们在 Redis 发布活动

RediSearch 2.0 迈出第一步

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

这个里程碑,代号为 2.0-M01,标志着索引与数据同步方式的重新架构。RediSearch 现在不再需要通过索引写入数据(使用 FT.ADD 命令),而是会跟踪写入哈希中的数据并自动对其进行索引。  

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

(注意:此新功能对 API(如下所示)引入了一些更改。我们尽力保持向后兼容性,但在这种情况下是不可能的。随着我们收集客户反馈,我们计划在未来进行调整和修复。)

RediSearch 2.0 里程碑的架构。

API 更改

如上所述,此 RediSearch 2.0 里程碑包括对 API 的一些更改:  

  1. 索引不再位于键空间中。例如,如果您使用索引键 (idx:<索引名称>) 在数据库中列出索引,则这将不再有效。但是,我们引入了一个命令 FT._LIST 来返回数据库中的所有索引。
  2. 索引必须使用前缀/过滤器创建。这些指定 RediSearch 将自动索引哪些文档。您可以指定一个简单的前缀和/或一个复杂的过滤器表达式。
  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 {结构} 目前仅支持 HASH
  • PREFIX {计数} {前缀} 告诉索引它应该索引哪些键。您可以添加多个前缀进行索引。由于参数是可选的,因此默认值为 *(所有键)
  • FILTER {过滤器} 是一个使用完整 RediSearch 聚合表达式语言 的过滤器表达式。可以使用 @__key 访问刚刚添加/更改的键
  • LANGUAGESCORE  允许您覆盖所有被索引文档的默认语言和分数
  • LANGUAGE_FIELDSCORE_FIELDPAYLOAD_FIELD 允许您拥有特定于文档的语言和评分,以及将有效负载用作文档中的字段。

其他限制和更改

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

  • NOSAVE 不再受支持。
  • 更新哈希意味着整个文档将被索引(键空间通知不会说明哪些字段已更改)。因此,部分更新将更慢。请注意,我们仍在研究提高这些情况下性能的选项。
  • 字段名称现在区分大小写,因此声明一个字段“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,以便映射按预期工作。

  • FT.ADDHASH 不再受支持。请使用 HSET
  • FT.OPTIMIZE 不再受支持,RediSearch 垃圾回收 功能负责优化索引。

结论

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