Пример UDF в Sphinx

Многие базы данных и поисковые системы позволяют настраивать запросы с помощью собственных так называемых “пользовательских функций” или UDF. Sphinx и Manticore не являются исключением. В документации есть большой раздел об этом - https://manual.manticoresearch.com/Extensions/UDFs_and_Plugins/UDF#UDF

Здесь я хочу привести простой пример того, как можно создать UDF, которая включает некоторую функциональность, которая может быть очень полезна в некоторых случаях, но отсутствует “из коробки” - функция sleep().

Сначала создайте код вашей UDF на языке C:

[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(), возвращающая текущую версию SPH_UDF_VERSION из включенного sphinxudf.h
  • и sleep(), которая выполняет работу - спит указанное количество секунд в первом аргументе

ПОДСКАЗКА: Убедитесь, что ваш файл имеет расширение “.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)

Если у вас есть какие-либо вопросы о UDF в Sphinx, не стесняйтесь спрашивать нас на нашем форуме или в нашем публичном Slack-канале .

Установить Manticore Search

Установить Manticore Search