本文介绍GBase 8a 集群全文索引功能,同时对多个分词器的配置方法和使用样例。
目录导航
警告
该功能并没有在官方文档里看到,也许是漏写了,也许是【实验性】功能,如在生产环境,请做严格测试后使用,最好针对固化数据(不再变动的历史天表,月表等)。
参考
GBase 8a全文索引功能安装部署方法
GBase 8a全文索引创建、更新和删除方法
GBase 8a全文索引常用配置文件和配置参数
GBase 8a全文索引提高模糊查询性能使用样例
GBase 8a全文索引多分词器的功能介绍和使用
配置文件修改
GbaseCharExt.xml
增加了extend部分,其中可以填写多个item部分,分别配置参数。参数项和默认的相同。注意其中的part2和part4的名字。
[gbase@gbase_rh7_001 cfg]$ cat GbaseCharExt.xml
<?xml version="1.0" encoding="UTF-8"?>
<segment>
<multisegmask>3</multisegmask>
<mixedcase>1</mixedcase>
<step>0</step>
<dict>0</dict>
<extend>
<item>
<name>part2</name>
<multisegmask>3</multisegmask>
<mixedcase>1</mixedcase>
<step>2</step>
<dict>0</dict>
</item>
<item>
<name>part4</name>
<multisegmask>3</multisegmask>
<mixedcase>1</mixedcase>
<step>4</step>
<dict>0</dict>
</item>
</extend>
</segment>
[gbase@gbase_rh7_001 cfg]$
gbfticfg.xml
增加了segments部分,中间包含多个item的配置,其中name和分词配置要匹配。
[gbase@gbase_rh7_001 cfg]$ cat gbfticfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<gbfticfg>
<hitFlush>64M</hitFlush>
<segThreads>4</segThreads>
<sortThreads>4</sortThreads>
<outThreads>3</outThreads>
<maxDocPerUnit>100000000</maxDocPerUnit>
<maxLineSize>2</maxLineSize>
<reduceMemMode>0</reduceMemMode>
<dictDynamicLoad>0</dictDynamicLoad>
<dictSlotPerUnit>16777216</dictSlotPerUnit>
<quickUpdate>0</quickUpdate>
<match>
<maxMatch>128</maxMatch>
<maxThreadPerTask>5</maxThreadPerTask>
</match>
<segment>
<name>GBaseCharExt</name>
<dsoPath>..//lib//libGbaseCharExt.so</dsoPath>
<outCharset>UTF-8</outCharset>
</segment>
<segments>
<item>
<name>part2</name>
<dsoPath>..//lib//libGbaseCharExt.so</dsoPath>
<outCharset>UTF-8</outCharset>
</item>
<item>
<name>part4</name>
<dsoPath>..//lib//libGbaseCharExt.so</dsoPath>
<outCharset>UTF-8</outCharset>
</item>
</segments>
</gbfticfg>
[gbase@gbase_rh7_001 cfg]$
重启服务
gcluster和gnode都要修改。然后重启所有涉及节点的数据库服务。
创建多个不同分词器的索引
如下分别用4元分词和2元分词创建了2个列的全文索引。
如果已经有索引,则需要删掉重新创建。
gbase> create fulltext index idx_memo on t1(memo) with parser part4;
Query OK, 0 rows affected (Elapsed: 00:00:00.16)
Records: 0 Duplicates: 0 Warnings: 0
gbase> create fulltext index idx_name on t1(name) with parser part2;
Query OK, 0 rows affected (Elapsed: 00:00:00.18)
Records: 0 Duplicates: 0 Warnings: 0
查询效果
4元分词不能检索到3个连续数字,2元分词也检索不到单个字母。
gbase> update index idx_memo on t1;
Query OK, 7 rows affected (Elapsed: 00:00:01.10)
gbase> update index idx_name on t1;
Query OK, 7 rows affected (Elapsed: 00:00:01.15)
gbase> select * from t1 where contains(memo,'1234');
+------+------+------+------------+---------------------+
| id | name | dept | birth | memo |
+------+------+------+------------+---------------------+
| 5 | Test | 3 | 1895-10-02 | Test12345678abcdefg |
+------+------+------+------------+---------------------+
1 row in set (Elapsed: 00:00:00.12)
gbase> select * from t1 where contains(memo,'123');
Empty set (Elapsed: 00:00:00.01)
gbase> select * from t1 where contains(name,'Te');
+------+-------+------+------------+----------------------+
| id | name | dept | birth | memo |
+------+-------+------+------------+----------------------+
| 5 | Test | 3 | 1895-10-02 | Test12345678abcdefg |
| 6 | Test2 | 4 | 2021-07-01 | GBase TianJin China. |
| 7 | Test3 | 4 | 2021-07-01 | China TianJin |
+------+-------+------+------------+----------------------+
3 rows in set (Elapsed: 00:00:00.15)
gbase>
gbase> select * from t1 where contains(name,'T');
Empty set (Elapsed: 00:00:00.01)