# Sphinx UDF example

许多数据库和搜索引擎允许您使用所谓的“用户自定义函数”或UDF来自定义查询。Sphinx和Manticore也不例外。文档中有一个关于此的长章节 - https://manual.manticoresearch.com/Extensions/UDFs_and_Plugins/UDF#UDF

在这里，我想快速举例说明如何创建一个UDF，该UDF可以实现某些在某些情况下非常有用但默认情况下缺失的功能，例如sleep()函数。

首先，用C语言创建你的UDF代码：

```bash
[snikolaev@dev01 ~]$ cat sleep.c
#include </home/snikolaev/./manticore_gitlab/src/sphinxudf.h>

int sleep_ver() {
	return SPH_UDF_VERSION;
}

sphinx_int64_t sleep ( SPH_UDF_INIT * init, SPH_UDF_ARGS * args, char * error_flag ) {
	usleep(*args->arg_values[0] * 1000000);
}


```
如你所见，它只有2个函数：
- `sleep_ver()` 仅返回包含的 `sphinxudf.h` 中的当前 `SPH_UDF_VERSION`
- 以及 `sleep()` 函数，它执行实际操作 - 根据参数#1提供的秒数休眠

**提示：确保你的文件扩展名为".c"，而不是".cpp"，否则可能无法正常工作。**

接下来你需要构建你的库：

```bash
[snikolaev@dev01 ~]$ gcc sleep.c -shared -o sleep.so -g -fPIC
[snikolaev@dev01 ~]$
```

现在你有了包含你函数的 `sleep.so`：

```bash
[snikolaev@dev01 ~]$ ls -la sleep.so
-rwx--x--x 1 snikolaev snikolaev 8209 Sep 10 04:37 sleep.so
```

接下来确保在配置中指定searchd应该在哪里查找UDF，使用 [plugin_dir](https://docs.manticoresearch.com/latest/html/conf_options_reference/common_section_configuration_options.html#plugin-dir) 指令：


```bash
common {
    plugin_dir = /home/snikolaev
}
```

现在启动searchd并创建函数：

```sql
mysql> create function sleep returns int soname 'sleep.so';
Query OK, 0 rows affected (0.00 sec)
```

**提示：如果你不想每次启动searchd时都执行此操作，可以将命令放入文件中：**


```bash
[snikolaev@dev01 ~]$ cat state.sql
CREATE FUNCTION sleep RETURNS INT SONAME 'sleep.so';
```

并使用

```bash
sphinxql_state = state.sql
```

*在你的配置的searchd部分，以便在启动时运行该命令。*

一旦函数在searchd中注册，你就可以使用它：

```bash
mysql> select sleep(1);
+----------+
| sleep(1) |
+----------+
| 0 |
+----------+
1 row in set (1.00 sec)
```

如果你对Sphinx UDF有任何疑问，请随时在我们的[论坛](https://forum.manticoresearch.com/)或我们的[公共Slack频道](https://slack.manticoresearch.com/)上提问。
