# **inner_product()**

## **函数说明**

`INNER_PRODUCT(vector1, vector2)` 返回两个向量的负点积，即 `-(vector1 · vector2)`。两个向量必须具有相同的维度。


## **函数语法**

```sql
SELECT inner_product(vector1, vector2) AS result FROM table_name;
```

## **示例**

```text
drop table if exists vec_table;
create table vec_table(a int, b vecf32(3), c vecf64(3));
insert into vec_table values(1, "[1,2,3]", "[4,5,6]");
mysql> select * from vec_table;
+------+-----------+-----------+
| a    | b         | c         |
+------+-----------+-----------+
|    1 | [1, 2, 3] | [4, 5, 6] |
+------+-----------+-----------+
1 row in set (0.00 sec)

mysql> select inner_product(b,"[1,2,3]") from vec_table;
+---------------------------+
| inner_product(b, [1,2,3]) |
+---------------------------+
|                       -14 |
+---------------------------+
1 row in set (0.00 sec)
```

## **限制**

两个参数向量必须具有相同的维度。

## 符号与排序

当前 MOI 后端的 `INNER_PRODUCT(a, b)` 返回**负点积**，即 `-(a · b)`。例如 `[1,2,3]` 与 `[4,5,6]` 的数学点积是 `32`，函数返回 `-32`；同一个向量 `[1,2,3]` 与自身计算得到 `-14`。

先在目标实例运行以下只读查询，确认当前后端版本的符号：

```sql
SELECT INNER_PRODUCT('[1,2,3]', '[4,5,6]') AS negative_dot_product,
       INNER_PRODUCT('[1,2,3]', '[1,2,3]') AS self_negative_dot_product;
```

按上述负点积语义，两个结果分别为 `-32` 和 `-14`。按内积检索相似向量时，使用 `ORDER BY INNER_PRODUCT(vector_column, query_vector) ASC`：数学点积越大，负点积越小。需要数学点积时使用 `-INNER_PRODUCT(a, b)`。

更换后端版本后，重新运行常量查询再确定排序方向。若结果为正数，则该实例的函数符号不同，不能直接套用上述 `ASC` 排序。
