Sphinx UDF 示例

许多数据库和搜索引擎允许您使用自己的所谓的"用户自定义函数"或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);
}

如你所见,它只有两个函数:

  • 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频道 上询问。

安装Manticore Search

安装Manticore Search