查询方言
了解如何使用查询方言
Redis Stack 目前支持四种查询方言,可与 FT.SEARCH、FT.AGGREGATE 和其他搜索和查询命令配合使用。方言可逐步增强查询 API,引入创新行为和新功能,以支持新的用例,而不会破坏现有应用程序的 API。```
方言 1
方言版本 1 是从搜索和查询的第一个版本到引入方言版本 2 的版本 2.4 的默认查询语法方言。此方言也是默认方言。有关更改默认方言的信息,请参见下文。
方言 2
方言版本 2 在 2.4 版本中引入,以解决在 Redis Stack 之前的版本中发现的查询解析器不一致问题。方言版本 1 仍然是默认方言。要使用方言版本 2,请将 DIALECT 2 附加到查询命令。对向量搜索的支持也在 2.4 版本中引入,并且需要 DIALECT 2。有关更多详细信息,请 在此处 查看。FT.SEARCH ... DIALECT 2
已确定在某些条件下,某些查询解析规则的行为与最初的预期不同。特别是,包含以下运算符的某些查询可能会返回意外的结果。
- AND,暗示交集的多词短语
"..."(精确)、~(可选)、-(否定)和%(模糊)- OR,用
|(管道)字符分隔的暗示并集的单词 - 通配符
如果属于以下任何类别,则使用方言 1 的现有查询使用方言 2 时可能会表现不同
-
你的查询具有字段修饰符,后跟多个单词。考虑示例查询
@name:James Brown此处,字段修饰符
@name后跟两个单词,James和Brown。在
DIALECT 1中,此查询将被解释为在@name字段中查找James Brown。在DIALECT 2中,此查询将被解释为在@name字段中查找James,并在任何文本字段中查找Brown。换句话说,它将被解释为(@name:James) Brown。在DIALECT 2中,你可以通过将查询更新为@name:(James Brown)来实现方言 1 行为。 -
你的查询使用
"..."、~、-和/或%。考虑一个带有否定的简单查询-hello world在
DIALECT 1中,此查询被解释为在不包含hello且不包含world的任何字段中查找值;相当于-(hello world)或-hello -world。在DIALECT 2中,此查询被解释为-hello和world(仅hello被否定)。在DIALECT 2中,你可以通过将查询更新为-(hello world)来实现方言 1 行为。 -
你的查询使用
|。考虑简单查询你好世界 | “再见”月亮在
DIALECT 1中,此查询被解释为搜索(hello world | "goodbye") moon。在DIALECT 2中,此查询被解释为搜索hello world或"goodbye" moon。 -
你的查询使用通配符模式。考虑简单查询
"w'foo*bar?'"如上所示,你必须使用双引号包含
w模式。
使用DIALECT 2,即使有停用词,你也可以在标签查询中使用未转义空格。
矢量搜索需要DIALECT 2。
DIALECT 3
方言版本 3 在 2.6 版本中引入。此版本引入了对多值索引的支持,以及对由 JSONPath 定义的任何属性类型(TEXT、TAG、NUMERIC、GEO 和 VECTOR)的属性进行查询的支持,该 JSONPath 导致数组或多个标量值。此方言中还引入了对 GEOSHAPE 查询的支持。
方言版本 2 和版本 3 之间的主要区别在于,对于多值属性,返回 JSON 而不是标量。除了在 FT.SEARCH 命令的末尾指定 DIALECT 3 之外,没有其他语法更改。方言版本 1 仍然是默认方言。要使用方言版本 3,请将 DIALECT 3 附加到你的查询命令。
FT.SEARCH ... DIALECT 3
示例
示例 JSON
{
"id": 123,
"underlyings": [
{
"currency": "USD",
"spot": 99,
"underlier": "AAPL UW"
},
{
"currency": "USD",
"spot": 100,
"underlier": "NFLX UW"
}
]
}
创建索引
FT.CREATE js_idx ON JSON PREFIX 1 js: SCHEMA $.underlyings[*].underlier AS und TAG
现在搜索,使用和不使用DIALECT 3。
-
使用方言 1(默认)
ft.search js_idx * return 1 und 1) (integer) 1 2) "js:1" 3) 1) "und" 2) "AAPL UW"只返回预期的两个元素中的第一个元素。
-
使用方言 3
ft.search js_idx * return 1 und DIALECT 3 1) (integer) 1 2) "js:1" 3) 1) "und" 2) "[\"AAPL UW\",\"NFLX UW\"]"返回两个元素。
基于形状的(POINT 或 POLYGON)地理空间查询需要 DIALECT 3。
DIALECT 4
方言版本 4 在 2.8 版本中引入。它为 FT.SEARCH 和 FT.AGGREGATE 上的排序操作引入了性能优化。除了在 FT.SEARCH 命令的末尾指定 DIALECT 4 之外,没有其他语法更改。方言版本 1 仍然是默认方言。要使用方言版本 4,请将 DIALECT 4 附加到你的查询命令。
FT.SEARCH ... DIALECT 4
方言版本 4 将在四种不同的场景中提高性能
- 跳过排序器 - 当不需要进行排序时应用。查询在达到请求结果的
LIMIT后即可返回。 - 部分范围 - 当对数字字段应用
SORTBY时应用,无论是否对同一数字字段进行过滤。此类查询将在足够大的范围内进行迭代,以满足请求结果的LIMIT。 - 混合 - 当除了另一个非数字过滤器外,还对数字字段应用
SORTBY时应用。某些结果可能会被过滤掉,从而留下太小的范围来满足任何指定的LIMIT。在这种情况下,迭代器将被重新启动,并进行额外的迭代以收集结果,直到达到请求的LIMIT。 - 无优化 - 如果按得分或按非数字字段排序,则别无选择,只能检索所有结果并将其值与搜索参数进行比较。
使用FT.EXPLAINCLI比较方言
[FT.EXPLAINCLI](https://redis.ac.cn/commands/ft.explaincli/) 是一款功能强大的工具,可让您深入了解查询的内部工作原理。它就像一个路线图,详细说明了您的查询从头到尾的历程。
当您运行FT.EXPLAINCLI时,它会返回一个数组,表示复杂查询的执行计划。此计划是 Redis 如何解释您的查询以及如何计划获取结果的分步指南。这是对该过程的幕后观察,让您深入了解搜索引擎的工作原理。
FT.EXPLAINCLI接受DIALECT参数,允许您使用不同的方言版本执行查询,从而比较生成的查询计划。
要使用FT.EXPLAINCLI,您需要提供一个索引和一个查询谓词。索引是您使用FT.CREATE创建的索引的名称,查询谓词与您将其发送到FT.SEARCH或FT.AGGREGATE时相同。
以下是如何使用FT.EXPLAINCLI了解方言版本 1 和 2 之间差异的示例。
令牌hello和world的交集的否定
1) NOT {
2) INTERSECT {
3) hello
4) world
5) }
6) }
7)
令牌hello的否定与令牌world的交集
FT.EXPLAINCLI idx:dialects "-hello world" DIALECT 2
1) INTERSECT {
2) NOT {
3) hello
4) }
5) UNION {
6) world
7) +world(expanded)
8) }
9) }
10)
与DIALECT 1相同的结果
FT.EXPLAINCLI idx:dialects "-(hello world)" DIALECT 2
1) NOT {
2) INTERSECT {
3) hello
4) world
5) }
6) }
7)
FT.EXPLAIN不会执行查询。它只解释计划。这是一种了解查询引擎如何解释您的查询的方法,当您尝试优化搜索时,这非常有价值。
更改默认方言
默认方言为 DIALECT 1。如果您希望更改,可以在加载 RediSearch 模块时使用 DEFAULT_DIALECT 参数
$ redis-server --loadmodule ./redisearch.so DEFAULT_DIALECT 2
您还可以使用 FT.CONFIG 命令更改已运行服务器上的查询方言
FT.CONFIG SET DEFAULT_DIALECT 2