搜索中的表达式

Manticore 通过 SQL 和 HTTP 支持使用任意算术表达式,包含属性值、内部属性(文档 ID 和相关性权重)、算术运算、多种内置函数和用户定义函数。以下是完整的参考列表,方便快速查阅。

算术运算符

+, -, *, /, %, DIV, MOD

支持标准算术运算符。涉及这些运算符的算术计算可以通过三种不同模式执行:

  1. 使用单精度 32 位 IEEE 754 浮点数(默认),
  2. 使用有符号 32 位整数,
  3. 使用有符号 64 位整数。

表达式解析器会自动切换到整数模式,如果没有运算结果为浮点数。否则,使用默认的浮点模式。例如,a+b 如果两个参数都是 32 位整数,则使用 32 位整数计算;如果两个参数都是整数但其中一个是 64 位,则使用 64 位整数计算;否则使用浮点数计算。但是,a/bsqrt(a) 总是以浮点数计算,因为这些运算返回非整数结果。为避免这种情况,可以使用 IDIV(a,b)DIV b 形式。此外,a*b 在参数为 32 位时不会自动提升为 64 位。要强制使用 64 位结果,请使用 BIGINT(),但请注意,如果存在非整数运算,BIGINT() 会被忽略。

比较运算符

<, > <=, >=, =, <>

比较运算符在条件为真时返回 1.0,否则返回 0.0。例如,当属性 a 等于属性 b 时,(a=b)+3 计算结果为 4;当 a 不等于 b 时,结果为 3。与 MySQL 不同,等值比较(即 =<> 运算符)包含一个小的相等阈值(默认 1e-6)。如果比较值之间的差异在阈值内,则视为相等。

对于多值属性,BETWEENIN 运算符如果至少有一个值满足条件,则返回真(类似于 ANY())。IN 运算符不支持 JSON 属性。IS (NOT) NULL 运算符仅支持 JSON 属性。

布尔运算符

AND, OR, NOT

布尔运算符(AND、OR、NOT)行为符合预期。它们是左结合的,并且优先级最低。NOT 的优先级高于 AND 和 OR,但仍低于其他运算符。AND 和 OR 具有相同优先级,建议在复杂表达式中使用括号以避免混淆。

位运算符

&, |

这些运算符分别执行按位与和按位或。操作数必须是整数类型。

函数:

HTTP JSON 中的表达式

在 HTTP JSON 接口中,通过 script_fieldsexpressions 支持表达式。

script_fields

{
    "table": "test",
    "query": {
        "match_all": {}
    }, "script_fields": {
        "add_all": {
            "script": {
                "inline": "( gid * 10 ) | crc32(title)"
            }
        },
        "title_len": {
            "script": {
                "inline": "crc32(title)"
            }
        }
    }
}

在此示例中,创建了两个表达式:add_alltitle_len。第一个表达式计算 ( gid * 10 ) | crc32(title) 并将结果存储在 add_all 属性中。第二个表达式计算 crc32(title) 并将结果存储在 title_len 属性中。

目前仅支持 inline 表达式。inline 属性的值(要计算的表达式)具有与 SQL 表达式相同的语法。

表达式名称可以用于过滤或排序。

‹›
  • script_fields
script_fields
📋
{
    "table":"movies_rt",
    "script_fields":{
        "cond1":{
            "script":{
                "inline":"actor_2_facebook_likes =296 OR movie_facebook_likes =37000"
            }
        },
        "cond2":{
            "script":{
                "inline":"IF (IN (content_rating,'TV-PG','PG'),2, IF(IN(content_rating,'TV-14','PG-13'),1,0))"
            }
        }
    },
    "limit":10,
    "sort":[
        {
            "cond2":"desc"
        },
        {
            "actor_1_name":"asc"
        },
        {
            "actor_2_name":"desc"
        }
    ],
    "profile":true,
    "query":{
        "bool":{
            "must":[
                {
                    "match":{
                        "*":"star"
                    }
                },
                {
                    "equals":{
                        "cond1":1
                    }
                }
            ],
            "must_not":[
                {
                    "equals":{
                        "content_rating":"R"
                    }
                }
            ]
        }
    }
}

默认情况下,表达式值包含在结果集的 _source 数组中。如果源是选择性的(参见源选择),可以将表达式名称添加到请求中的 _source 参数中。注意,表达式名称必须是小写。

expressions

expressionsscript_fields 的一种替代方案,语法更简单。示例请求添加了两个表达式,并将结果存储到 add_alltitle_len 属性中。注意,表达式名称必须是小写。

‹›
  • expressions
expressions
📋
{
  "table": "test",
  "query": { "match_all": {} },
  "expressions":
  {
      "add_all": "( gid * 10 ) | crc32(title)",
      "title_len": "crc32(title)"
  }
}
Last modified: August 28, 2025