2

我正在执行这样的 REDISEARCH 标记仅搜索查询:

'@tags:{美食|餐厅|芝加哥}'

我想根据文档中这些标签的成功匹配数对结果进行排序。

以便:

  • 包含所有 3 个标签的文档将排名第一
  • 仅匹配其中 2 个的文档将排名第二
  • 仅计算 1 的文档将排名第三。

这可能吗 ?如果是这样,请问我该如何执行这种排序?

谢谢!

4

1 回答 1

0

在当前状态下,这并不直接在 RediSearchemphasized 文本的功能集中。匹配的标签不计入分数。一个例子:

127.0.0.1:6379> ft.create test SCHEMA mytags TAG
OK
127.0.0.1:6379> ft.add test one 1 FIELDS mytags "aa"
OK
127.0.0.1:6379> ft.add test two 1 FIELDS mytags "aa,bb"
OK
127.0.0.1:6379> ft.add test three 1 FIELDS mytags "aa,bb,cc"
OK
127.0.0.1:6379> ft.add test four 1 FIELDS mytags "aa,bb"
OK

查询时,添加WITHSCORES参数:

127.0.0.1:6379> FT.SEARCH test "@mytags:{aa|bb|cc}" WITHSCORES
 1) (integer) 4
 2) "four"
 3) "inf"
 4) 1) "mytags"
    2) "aa,bb"
 5) "three"
 6) "inf"
 7) 1) "mytags"
    2) "aa,bb,cc"
 8) "two"
 9) "inf"
10) 1) "mytags"
    2) "aa,bb"
11) "one"
12) "inf"
13) 1) "mytags"
    2) "aa"

表示此"inf"比赛没有得分,因此此处不考虑顺序以用于得分目的。

我还尝试使用聚合引擎来执行此操作,但找不到创建有效计算匹配标签的管道的方法。

这似乎是一个直接的用途,我确实为此提出了问题

几个解决方法:

  1. 您也许可以使用TEXT字段和可选子句 ( "~Food|~Restaurant|~Chicago"),但文本字段的属性会略有不同。
  2. RedisGears 可用于将几个查询组合成一个结果。
于 2020-07-07T19:23:05.437 回答