许多数据库和搜索引擎允许您使用自己所谓的“用户定义函数”或 UDF 自定义查询。Sphinx 和 Manticore 也不例外。文档中有一长段关于此的内容 - https://manual.manticoresearch.com/Extensions/UDFs_and_Plugins/UDF#UDF
在这里,我想给出一个快速示例,说明如何创建一个 UDF,它启用一些在某些情况下非常有用但开箱即用缺失的功能 - sleep() 函数。
首先,在 C 中创建您的 UDF 代码:
[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",否则可能无法正常工作。
接下来,您需要构建您的库:
[snikolaev@dev01 ~]$ gcc sleep.c -shared -o sleep.so -g -fPIC
[snikolaev@dev01 ~]$
您现在有 sleep.so,其中包含您的函数:
[snikolaev@dev01 ~]$ ls -la sleep.so
-rwx--x--x 1 snikolaev snikolaev 8209 Sep 10 04:37 sleep.so
接下来,请确保在您的配置中指定 searchd 应该在哪里查找 UDF,使用 plugin_dir 指令:
common {
plugin_dir = /home/snikolaev
}
现在启动 searchd 并创建函数:
mysql> create function sleep returns int soname 'sleep.so';
Query OK, 0 rows affected (0.00 sec)
提示:如果您不想每次启动 searchd 时都这样做,可以将命令放入文件中:
[snikolaev@dev01 ~]$ cat state.sql
CREATE FUNCTION sleep RETURNS INT SONAME 'sleep.so';
并使用
sphinxql_state = state.sql
在您的配置的 searchd 部分中,以便它在启动时运行该命令。
一旦您在 searchd 中注册了该函数,您就可以使用它:
mysql> select sleep(1);
+----------+
| sleep(1) |
+----------+
| 0 |
+----------+
1 row in set (1.00 sec)
如果您对 Sphinx UDF 有任何疑问,请随时在我们的 论坛 或我们的 公共 Slack 频道 中询问我们。