dot 快速的未来正在您的城市举办的活动中到来。

加入我们参加 Redis 发布会

RediSearch 更新:聚合和新功能

RedisConf 的主要公告之一是 RediSearch (版本 1.1.0) 的聚合引擎。聚合是像 RediSearch 这样的实时搜索引擎的强大功能。它们允许不仅查询数据,而且还可以对其进行数学汇总以获得分析洞察。RediSearch 聚合配有标准的归约器工具包:

  • 计数
  • 总和
  • 最小值
  • 最大值
  • 标准偏差
  • 分位数

从概念上讲,聚合由一系列操作组成。每个操作可以在任何逻辑顺序下使用,也可以重复。基本操作是

  • 分组和归约
  • 排序
  • 转换(应用)
  • 限制
  • 过滤

例如,在电子商务场景中,您有过去十年中数百万次运输的日期时间戳和总箱子大小(box_area)。假设您想找到箱子面积大于 300 的运输量最大的前三年。我们不关心确切的数字;我们只想要粗略的数字,并且应该格式良好。我们的聚合查询将如下所示

FT.AGGREGATE shipments "@box_area:[300 +inf]" 
  APPLY "year(@shipment_timestamp / 1000)" AS shipment_year 
  GROUPBY 1 @shipment_year REDUCE COUNT 0 AS shipment_count 
  SORTBY 2 @shipment_count DESC 
  LIMIT 0 3 
  APPLY "format(\"%sk+ Shipments\",floor(@shipment_count / 1000))" AS shipment_count

这可能与您见过的任何 Redis 命令都不一样,但当您将其分解时,它并不复杂。

FT.AGGREGATE shipments "@box_area:[300 +inf]"在索引“shipments”中,查找 box_area 大于 300 的项目。这使用与 RediSearch 其余部分相同的查询语法。
APPLY "year(@shipment_timestamp)" AS shipment_year这将 shipment_timestamp 转换为包含的函数的年份。此结果现在将可作为 shipment_year.
GROUPBY 1 @shipment_year REDUCE COUNT 0 AS shipment_count将所有 shipment_year 结果分组在一起并计数。将此结果称为 shipment_count.
SORTBY 2 @shipment_count DESC我们将按照之前步骤中计算出的计数的降序对这些值进行排序。
LIMIT 0 3我们只对前三个值感兴趣。
APPLY "format("%sk+ Shipments",floor(@shipment_count / 1000))" AS shipment_count再次转换计数。从内部表达式(在 floor 中)开始,我们将进行一些算术运算以缩短数字,因为我们不关心确切的值。然后我们将使用 floor 来删除小数点后的任何内容。最后,我们将使用 printf 样式格式,并将其称为(再次) shipment_count.

这将输出以下结果

1) (integer) 10
2) 1) "shipment_year"
   2) "2014"
   3) "shipment_count"
   4) "10k+ Shipments"
3) 1) "shipment_year"
   2) "2017"
   3) "shipment_count"
   4) "9k+ Shipments"
4) 1) "shipment_year"
   2) "2015"
   3) "shipment_count"
   4) "9k+ Shipments"

通过将这些操作组合在一起,您可以以前所未有的方式快速分析您的数据。这是一个非常深奥且广泛的功能,比这篇博文中能轻易总结的要大得多,因此最好看看它的实际应用。观看此视频以了解 Dvir 如何演示聚合

https://www.youtube.com/embed/9h3Qco_x0QE

在 RedisConf 之后不久,我们发布了 RediSearch 1.2.0,其中包含大量新功能

查询属性

使子查询修改查询的子句。这允许

~(ice cream sandwich) => { $weight: 0.5; }

上述命令会导致任何包含“ice”、“cream”和“sandwich”的文档的权重为 0.5。您还可以根据子查询修改松弛度($slop)和“按顺序”要求($inorder)。

模糊匹配

匹配任何字符距离为一个字符的项目。例如, “%redis%” 不仅会匹配 ‘redis’,还会匹配 ‘jedis’ 和 ‘predis’。

条件更新

仅在满足条件时更新文档,例如

FT.ADD idx myDoc 1.0 
   REPLACE PARTIAL
   IF "@timestamp < 12313134523" 
   FIELDS 
       title "new title"

此代码将在日期时间戳低于 12313134523 时更新文档 ‘myDoc’。它将 更新标题。

反斜杠转义

使用反斜杠作为转义符,以便将控制字符作为普通文本处理。此查询将在索引文档中查找“hello-world”和“world”

FT.SEARCH idx "hello-world world"

同义词支持

在您有完全等效但拼写不同的情况时,匹配可能很棘手。使用 FT.SYNADD 和 FT.SYNUPDATE,您可以添加等效的术语,并且随后添加的文档将被匹配。鉴于以下

FT.SYNADD idx hello hola hej bonjour

任何包含这些术语的新文档都将与类似这样的查询匹配

FT.SEARCH idx hej

最后,版本 1.2.0 是 Dvir 领导的 RediSearch 的最后一个版本。我们很遗憾 看到他离开,但我们祝他在新组织中的新冒险一切顺利(我们了解到,他们正在构建一些与 RediSearch 完全不同的非常酷的东西)。不过不用担心,RediSearch 正在由 Redis 的一个完整团队开发,他们将继续创新并推动 RediSearch 发展。