Redis JSON:搜索空字符串/ null

4uqofj5v  于 8个月前  发布在  Redis
关注(0)|答案(1)|浏览(85)

当我调用下面的函数时,我得到了结果输出:

> FT.CREATE Results ON JSON SCHEMA $.a AS masterId TEXT $.b AS value numeric ...
> <Insert Data>
> FT.AGGREGATE Results .* GROUPBY 1 @masterId REDUCE SUM 1 @value AS value LIMIT 0 100

1) (integer) 3
2) 1) "masterId"
   2) ""
   3) "value"
   4) "61.03"
3) 1) "masterId"
   2) "1985748"
   3) "value"
   4) "121.78"
4) 1) "masterId"
   2) "1985749"
   3) "value"
   4) "129.85"

然后,我可以通过特定的masterId搜索项目列表:

> FT.SEARCH Results @masterId:1985749 LIMIT 0 1000
1) (integer) 154
...

但是我不知道如何搜索“空白”@masterId:""的结果。搜索双引号、单引号、NULL等都返回语法错误或0结果。是正确的语法在文档在线某处&我只是瞎了眼,是一些奇怪的怪癖周围的“空”键,还是它必须与非标准的转义字符(例如。我试过\"\")?

whitzsjs

whitzsjs1#

我不认为FT.SEARCH会允许这样做,但是,你可以使用FT.AGGREGATE和一个过滤器来做更高级的搜索。
但首先,masterId字段应该是TAG而不是TEXT。TEXT用于全文搜索。就像是供人类阅读的文本段落。它做了很多事情来优化这一点,如词干和忽略标点符号和停止词。
这可能不是你想要的,所以对于这些例子,我将调用FT.CREATE改为:

127.0.0.1:6379> FT.CREATE Results ON JSON SCHEMA $.a AS masterId TAG $.b AS value numeric
OK

无论如何,这里有一个使用FT.AGGREGATE搜索masterId的空字符串值的示例:

127.0.0.1:6379> FT.AGGREGATE Results * LOAD 2 masterId value FILTER '@masterId == ""'
1) (integer) 3
2) 1) "masterId"
   2) ""
   3) "value"
   4) "61.03"

请注意,您需要LOAD任何您希望返回或过滤的字段。
下面是undefined

127.0.0.1:6379> JSON.DEL foo $.a
(integer) 1
127.0.0.1:6379> FT.AGGREGATE Results * LOAD 2 masterId value FILTER '!exists(@masterId)'
1) (integer) 3
2) 1) "value"
   2) "61.03"

注意,我调用的是exists()函数。有一大堆FT.AGGREGATE的函数可以与APPLY一起使用,也可以与FILTER一起使用。
此外,您可能希望将尽可能多的查询作为主查询字符串的一部分,因为我相信这样会更有效。例如,假设我们想要缺少masterId的文档,并且value在50和75之间:

127.0.0.1:6379> FT.AGGREGATE Results '@value:[50 75]' LOAD 2 masterId value FILTER '!exists(@masterId)'
1) (integer) 1
2) 1) "value"
   2) "61.03"

希望这对你有帮助!

相关问题