Многие базы данных и поисковые системы позволяют настраивать запросы с помощью собственных так называемых “пользовательских функций” или 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-канале .