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