Пример 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(), которая выполняет задачу - заставляет спать на количество секунд, указанное в аргументе #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