# • 表达式

Manticore 允许通过 SQL 和 HTTP 使用任意算术表达式，这些表达式可以结合属性值、内部属性（文档 ID 和相关性权重）、算术操作、多个内置函数以及用户定义的函数。以下是完整的参考列表，方便快速查阅。

## 算术运算符

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

提供标准的算术运算符。涉及这些运算符的算术计算可以在三种模式下执行：

1. 使用单精度 32 位 IEEE 754 浮点值（默认模式），
2. 使用带符号的 32 位整数，
3. 使用 64 位带符号整数。

如果没有操作结果为浮点值，表达式解析器会自动切换到整数模式。否则，将使用默认的浮点模式。例如，如果 `a` 和 `b` 都是 32 位整数，那么 `a+b` 将使用 32 位整数计算；如果其中一个是 64 位整数，则使用 64 位整数计算；否则使用浮点数计算。然而，`a/b` 或 `sqrt(a)` 将始终以浮点数计算，因为这些操作返回非整数结果。要避免这种情况，您可以使用 `IDIV(a,b)` 或 `a DIV b`。此外，`a*b` 不会自动提升为 64 位结果。要强制得到 64 位结果，可以使用 [BIGINT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/type_casting_functions#BIGINT\(\))，但请注意，如果存在非整数操作，`BIGINT()` 将被忽略。

## 比较运算符

```sql
<, > <=, >=, =, <>
```

比较运算符在条件为真时返回 `1.0`，否则返回 `0.0`。例如，`(a=b)+3` 在属性 `a` 等于属性 `b` 时，返回 4；如果 `a` 不等于 `b`，则返回 3。与 MySQL 不同，等值比较（即 `=` 和 `<>` 运算符）包括一个小的等值阈值（默认为 1e-6）。如果比较值之间的差异在该阈值内，它们将被视为相等。

`BETWEEN` 和 `IN` 运算符在多值属性的情况下，如果至少有一个值匹配条件，则返回 true（类似于 [ANY()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#ANY\(\))）。`IN` 运算符不支持 JSON 属性。`IS (NOT) NULL` 运算符仅支持 JSON 属性。

## 布尔运算符

```sql
AND, OR, NOT
```

布尔运算符（AND、OR、NOT）的行为如预期。它们是左结合的，并且优先级低于其他运算符。NOT 的优先级高于 AND 和 OR，但仍然低于任何其他运算符。AND 和 OR 的优先级相同，因此在复杂表达式中建议使用括号以避免混淆。

## 位运算符

```sql
&, |
```

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

## 函数：

* [ABS()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#ABS\(\))
* [ALL()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#ALL\(\))
* [ANY()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#ANY\(\))
* [ATAN2()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#ATAN2\(\))
* [BIGINT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/type_casting_functions#BIGINT\(\))
* [BITDOT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#BITDOT\(\))
* [BM25F()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/searching_and_ranking_functions#BM25F\(\))
* [CEIL()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#CEIL\(\))
* [CONCAT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/string_functions#CONCAT\(\))
* [CONTAINS()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#CONTAINS\(\))
* [COS()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#COS\(\))
* [CRC32()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#CRC32\(\))
* [DATE\_HISTOGRAM()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#DATE_HISTOGRAM\(\))
* [DATE\_RANGE()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#DATE_RANGE\(\))
* [DAY()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#DAY\(\))
* [DOUBLE()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/type_casting_functions#DOUBLE\(\))
* [EXP()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#EXP\(\))
* [FIBONACCI()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#FIBONACCI\(\))
* [FLOOR()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#FLOOR\(\))
* [GEODIST()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/geo_spatial_functions#GEODIST\(\))
* [GEOPOLY2D()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/geo_spatial_functions#GEOPOLY2D\(\))
* [GREATEST()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#GREATEST\(\))
* [HOUR()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#HOUR\(\))
* [HISTOGRAM()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#HISTOGRAM\(\))
* [IDIV()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#IDIV\(\))
* [IF()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#IF\(\))
* [IN()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#IN\(\))
* [INDEXOF()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#INDEXOF\(\))
* [INTEGER()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/type_casting_functions#INTEGER\(\))
* [INTERVAL()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#INTERVAL\(\))
* [LAST\_INSERT\_ID()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/other_functions#LAST_INSERT_ID\(\))
* [LEAST()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#LEAST\(\))
* [LENGTH()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#LENGTH\(\))
* [LN()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#LN\(\))
* [LOG10()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#LOG10\(\))
* [LOG2()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#LOG2\(\))
* [MAX()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#MAX\(\))
* [MIN()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#MIN\(\))
* [MINUTE()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#MINUTE\(\))
* [MIN\_TOP\_SORTVAL()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/searching_and_ranking_functions#MIN_TOP_SORTVAL\(\))
* [MIN\_TOP\_WEIGHT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/searching_and_ranking_functions#MIN_TOP_WEIGHT\(\))
* [MONTH()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#MONTH\(\))
* [NOW()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#NOW\(\))
* [PACKEDFACTORS()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/searching_and_ranking_functions#PACKEDFACTORS\(\))
* [POLY2D()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/geo_spatial_functions#POLY2D\(\))
* [POW()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#POW\(\))
* [RAND()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#RAND\(\))
* [RANGE()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#RANGE\(\))
* [REGEX()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/string_functions#REGEX\(\))
* [REMAP()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/arrays_and_conditions_functions#REMAP\(\))
* [SECOND()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#SECOND\(\))
* [SIN()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#SIN\(\))
* [SINT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/type_casting_functions#SINT\(\))
* [SQRT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/mathematical_functions#SQRT\(\))
* [SUBSTRING\_INDEX()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/string_functions#SUBSTRING_INDEX\(\))
* [TO\_STRING()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/type_casting_functions#TO_STRING\(\))
* [UINT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/type_casting_functions#UINT\(\))
* [YEAR()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#YEAR\(\))
* [YEARMONTH()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#YEARMONTH\(\))
* [YEARMONTHDAY()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/date_and_time_functions#YEARMONTHDAY\(\))
* [WEIGHT()](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/functions/searching_and_ranking_functions#WEIGHT\(\))

## HTTP JSON中的表达式

在 HTTP JSON 接口中，表达式通过 `script_fields` 和 `expressions` 支持。

### script\_fields

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

在这个例子中，创建了两个表达式：`add_all` 和 `title_len`。第一个表达式计算 `( gid * 10 ) | crc32(title)` 并将结果存储在 `add_all` 属性中。第二个表达式计算 `crc32(title)` 并将结果存储在 `title_len` 属性中。

目前，仅支持 `inline` 表达式。`inline` 属性的值（要计算的表达式）语法与 SQL 表达式相同。

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

**script\_fields:**

```json
{
	"index":"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` 数组中。如果源选择是选择性的（参见 [源选择](https://vergil-lai.gitbook.io/manticoresearch-manual-zh/search_results#Source-selection)），表达式名称可以添加到请求中的 `_source` 参数中。请注意，表达式的名称必须为小写。

### expressions

`expressions` 是 `script_fields` 的替代方法，语法更为简单。示例请求添加了两个表达式，并将结果存储在 `add_all` 和 `title_len` 属性中。请注意，表达式的名称必须为小写。

```json
{
  "index": "test",
  "query": { "match_all": {} },
  "expressions":
  {
	  "add_all": "( gid * 10 ) | crc32(title)",
      "title_len": "crc32(title)"
  }
}
```
