Написал аналог функции FIELD() в MySQL для Sphinx
В MySQL есть замечательная функция FIELD(). С её помощью, например, можно сортировать результаты выборки, зная точный порядок элементов.
Например, SELECT FIELD('c', 'a', 'b', 'c', 'd', 'e');
вернёт 3.
Понадобилась точно такая же функция, но в SphinxQL. Так в итоге родился плагин для Sphinx, о котором я расскажу в заметке.
Дополнительные функции в Sphinx называются — Sphinx UDFs (User Defined Functions).
Свою функцию-аналог я назвал BK_FIELD.
Установка
Качаем с гитхаба исходники:
$ git clone https://github.com/olegpro/sphinx-udf-field.git $ cd sphinx-udf-field
Компилируем плагин из исходников:
$ make $ sudo make install
В этот момент в текущей папке появится файл bk_field.so. Он автоматически будет скопирован в папку /usr/local/sphinx/lib/
Теперь нужно в конфиге сфинкса sphinx.conf указать путь к папке с плагинами:
common { plugin_dir = /usr/local/sphinx/lib }
Осталось только зарегистрировать udf-функцию в сфинксе.
Для этого подключаемся к сфинксу, примерно так:
$ mysql -h127.0.0.1 -P9306
Регистрируем udf-функцию:
mysql> CREATE FUNCTION bk_field RETURNS BIGINT SONAME 'bk_field.so'; Query OK, 0 rows affected (0,00 sec)
Пример работы
mysql> SELECT BK_FIELD('c', 'a', 'b', 'c', 'd', 'e'); +----------------------------------------+ | BK_FIELD('c', 'a', 'b', 'c', 'd', 'e') | +----------------------------------------+ | 3 | +----------------------------------------+ 1 row in set (0.00 sec)
Вот, собственно, и всё.
Некоторые нюансы
Функция BK_FIELD разрегистрируется
При использование udf-функций мы порой начали ловить ошибку:
ERROR 1064 (42000): Sphinx expr: syntax error, unexpected '(', expecting $end near '('c', 'a', 'b', 'c', 'd', 'e')'
Как оказалось, что функция BK_FIELD просто разрегистрировалась в сфинксе после перезапуска демона searchd. Решение простое.
Пишем sql-файл с содержимым регистрации плагина:
CREATE FUNCTION bk_field RETURNS BIGINT SONAME 'bk_field.so';
Указываем этот файл в секции searchd в sphinx.conf:
searchd { sphinxql_state = /var/lib/sphinx/startup.sql }
При компилировании в Visual Studio выдает ошибки
Плагин я писал в Visual Studio. При компилировании в Visual Studio выдает следующие ошибки:
"C:\Windows\SysWOW64\ntdll.dll". Невозможно найти или открыть PDB-файл. "C:\Windows\SysWOW64\kernel32.dll". Невозможно найти или открыть PDB-файл. "C:\Windows\SysWOW64\KernelBase.dll". Невозможно найти или открыть PDB-файл. "C:\Windows\SysWOW64\msvcp120d.dll". Невозможно найти или открыть PDB-файл. "C:\Windows\SysWOW64\msvcr120d.dll". Невозможно найти или открыть PDB-файл.
Решение: включить в настройках Visual Studio (Tool - Options) симовл серверов Microsoft и тогда ненайденные PDB файлы для системных библиотек будут загружены с сервера Microsoft:
Полезные ссылки
- BK_FIELD на GitHub
- Sphinx UDFs
- Реализация в mysql (начинается со строки longlong Item_func_field::val_int())
- Плагин для сфинкса на GO
- Makefile для самых маленьких