Не понял как делать полнотекстовый поиск по полям типа 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