分解数据矩阵。探索Redis提供了什么。
reddisconf的一个关键公告是聚合引擎RediSearch(版本1.1.0版)。聚合对于像RediSearch这样的实时搜索引擎来说是一个非常强大的功能。它们不仅允许对数据进行查询,还允许对数据进行数学总结以获得分析洞察力。研究聚合随标准工具箱的reducers而来:
从概念上讲,聚合由操作管道组成。每个操作可以按任何逻辑顺序使用,并且可以重复。基本操作如下:
例如,以电子商务场景中的发货为例,其中有一个时间戳和过去十年中数百万次发货的总盒子大小(box_area)。让我们假设你想要找出前三年的箱子出货量最多的三年,这些箱子的面积大于300。我们不关心确切的数字;我们只是想要粗略的数字,它应该很好地格式化。我们的聚合查询看起来像这样:
这可能看起来不像你见过的任何Redis命令,但当你分解它,它不是那么复杂。
总出货量“@box_area:[300 +inf]” |
在索引中"出货,“找到有。box_area大于300。它使用与RediSearch其余部分相同的查询语法。 |
应用“一年(@shipment_timestamp)”作为shipment_year |
这个转换shipment_timestamp进入一年与包含的功能。这个结果现在将为shipment_year. |
GROUPBY 1 @shipment_year减少计数0 AS shipment_count |
集团所有的shipment_year把结果放在一起算。将此结果称为shipment_count. |
排序by 2 @shipment_count DESC |
我们将按照从上一步计算出的计数降序排列这些值。 |
极限0 3 |
我们只对前三个值感兴趣。 |
申请“格式(“%sk+装运”,楼层(@shipment_count / 1000))”作为shipment_count |
再次变换计数。从内心表达开始地板上),我们将做一些算术来缩短数字,因为我们不关心确切的值。然后我们将使用地板上去掉小数点后的数。最后,我们将使用printf样式格式化,并将其引用为(再次)shipment_count. |
这将输出以下结果:
1)(整数)10 2)1)“shipment_year”2)“2014”3)“shipment_count”4)“10k+发货”3)1)“shipment_year”2)“2017”3)“shipment_count”4)“9k+发货”4)1)“shipment_year”2) "2015" 3) "shipment_count" 4) "9k+ Shipments"
通过将这些操作安排在一起,您可以以以前不可能的方式快速分析数据。这是一个非常深刻和扩展的功能,比这篇博客文章中简单总结的要大,所以最好看看它的实际应用。观看这个视频,看看Dvir演示聚合:
在RedisConf之后不久,我们发布了redisch 1.2.0,其中包含了大量的新特性:
进行子查询,修改查询的子句。这允许:
~(冰淇淋三明治)=>{$重量:0.5;}
上述命令导致任何含有“ice”、“cream”和“sandwich”的文档的重量为0.5。您还可以根据子查询修改slop ($slop)和“order”需求($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”:
搜索idx "hello-world "
在具有不同拼写的完全对等物的情况下,匹配可能会很棘手。使用FT.SYNADD和FT.SYNUPDATE,您可以添加等价的术语,随后添加的文档将被匹配。鉴于以下几点:
FT.SYNADD idx hello hola hej bonjour
任何带有这些术语的新文档都将在这样的查询中匹配:
FT.SEARCH idx hej
最后,1.2.0版本是由Dvir领导的redisresearch的最后一个版本。我们悲伤看到他走但我们祝愿他在一个新的组织(创建一些我们认为非常酷且与RediSearch非常不同的东西)的新冒险中一切顺利。不要担心,reresearch是由一个完整的团队在这里开发的复述,将继续创新,推动reresearch向前发展。