В 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:


Полезные ссылки