南大通用GBase 8a全文索引多分词器的功能配置和使用

本文介绍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)