Не понял как делать полнотекстовый поиск по полям типа LVARCHAR и TEXT, взялся читать ман на сайте IBM. Из того же мануала я понял, что делать поиск без учета регистра не получится(мож я конечно ошибаюсь). И еще одна оговорка, я не понял, почему этот метод не работает с полями типа TEXT и BYTE, ну т.е. не понятно почему IBM не реализовали это.
И так будем делать полнотекстовый поиск по полям типа LVARCHAR и CLOB(я изменил на этот тип TEXT). Метод основывается на BTS(Basic Text Search). В этой статейке я расскажу как подключить его в информиксе, и что из этого выйдет. Я опускаю, что у нас есть некоторая чистая БД, пусть с таблицами, но без лишних наворотов(extend). И так начнемс.
Первое, проверяем выставлен ли визуальный процессор для BTS(VPCLASS). Команда котороя выводит список всех установленных VPCLASS:
# onstat -c VPCLASS
cpu,num=1,max=1,noage
А подключаем его в файле $INFORMIXDIR/etc/onconfig
VPCLASS bts,noyield,num=1
После этого перезапускаем сервер. После рестарта наблюдаем следующую картину:
#onstat -c VPCLASS
cpu,num=1,max=1,noage
bts,noyield,num=1
В доках по информиксу написано, что для подключения BTS ему нужен чанк sbspace с включённым логированием для хранения информации по инденксам. Если оно у вас есть то можно пропустить следующие шаги. Я напишу что будет если такого чанка нет(чтобы самому не забыть, да может ещё кому нить пригодится). И так, пробуем подлючить расширение BTS:
ls -d $INFORMIXDIR/extend/bts.*
/usr/informix//extend/bts.2.00 # blademgr
bgd>register bts.2.00 test
Register module bts.2.00 into database test? [Y/n]y
Registering DataBlade module... (may take a while).
blademgr: ERROR: DataBlade bts.2.00 could not be registered in database test.
Use 'show last log' for details of failures in module's scripts.
bgd>bgd>show last log
blade: bts.2.00
err expct: unexpected
SQL stmt: execute function SYSBldTstSBSpace("");
SQL state: XU0001:-937 : SYSBldTstSBSpace (ifxmngr): Requested smart blob space (default) is not available on this server. blade: bts.2.00
err expct: unexpected
SQL stmt: EXCEPTION
SQL state: Registration failed for DataBlade module "bts.2.00".
bgd>
Это ошибка и означает что нет чанка с включённым логированием. Исправляем ситуацию (onspaces -c):
# touch $INFORMIXDIR/DATA/bts_sbspace
# chown informix.informix $INFORMIXDIR/DATA/bts_sbspace
# chmod 660 $INFORMIXDIR/DATA/bts_sbspace
# onspaces -c -S bts_sbspace -p $INFORMIXDIR/DATA/bts_sbspace -o 0 -s 50000 -Df "LOGGING=ON"
Verifying physical disk space, please wait ...
Space successfully added. ** WARNING ** A level 0 archive of Root DBSpace will need to be done.
# ontape -s -L 0
Archive to tape device '/dev/null' is complete. Program over.
#
Для верности рестартнём Informix. Повторяем процедуру подключения расширения BTS:
# blademgr
bgd>register bts.2.00 test
Register module bts.2.00 into database test? [Y/n]y
Registering DataBlade module... (may take a while).
blademgr: ERROR: DataBlade bts.2.00 could not be registered in database test.
Use 'show last log' for details of failures in module's scripts.
bgd>bgd>show last log
blade: bts.2.00
err expct: unexpected
SQL stmt: execute function SYSBldTstSBSpace("");
SQL state: XU0001:-937 : SYSBldTstSBSpace (ifxmngr): Requested smart blob space (default) is not available on this server. blade: bts.2.00
err expct: unexpected
SQL stmt: EXCEPTION
SQL state: Registration failed for DataBlade module "bts.2.00".
bgd>exit
Disconnecting...
Опять фигня. Лан, делаем вот что: идем в $INFORMIXDIR/etc/onconfig в поле SBSPACENAME прописываем имя созданного чанка и ребудаем Informix. Опять пытаемся подключить BTS:
# blademgr
bgd>register bts.2.00 bkilo
Register module bts.2.00 into database bkilo? [Y/n]y
Registering DataBlade module... (may take a while).
DataBlade bts.2.00 was successfully registered in database test.
bgd>bgd>exit
Disconnecting...
#
Вот теперь все прошло нормально.
Шаг второй. Как именно работает полнотекстовый поиск. Нужно создать индекс на нужное нам поле таблицы, и применять к этому поиск BTS. Например у нас есть таблица:
CREATE TABLE test( name LVARCHAR, data CLOB
);
Сразу оговорюсь, в данном примере у меня не получилось навести индекс сразу на два поля, почему не знаю. Создаём индекс:
CREATE INDEX name_bts ON test (name bts_lvarchar_ops) USING bts IN bts_sbspace; CREATE INDEX data_bts ON test (data bts_clob_ops) USING bts IN bts_sbspace;
Теперь можно пользоваться функциями BTS для поиска, например:
SELECT name FROM test WHERE bts_contains(name, 'TeSt*'); SELECT name FROM test WHERE bts_contains(data, 'tEsT*');
Еще не понятная мне вещь... Почему нельзя использовать символ * в начале искомого слова('*test')... Как узнаю отпишу.. И еще не понял как одновременно искать, например по двум разным полям...
Очень помогло:
https://www-304.ibm.com/support/docview.wss?uid=swg21181701
http://publib.boulder.ibm.com/infocenter/idshelp/v117/topic/com.ibm.dbext.doc/ids_dbxt_175.htm