⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.

Sphinx UDF example

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

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

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