KingbaseES 内置的缺省的分词解析器采用空格分词,因为中文的词语之间没有空格分割,所以这种方法并不适用于中文。要支持中文的全文检索需要额外的中文分词插件:zhparser and sys_jieba,其中zhparser 支持 GBK 和 UTF8 字符集,sys_jieba 支持 UTF8 字符集。

一、默认空格分词

1、tsvector

test=# SELECT to_tsvector('English','Try not to become a man of success, but rather try to become a man of value');
to_tsvector
----------------------------------------------------------------------
'becom':4,13 'man':6,15 'rather':10 'success':8 'tri':1,11 'valu':17
(1 row) test=# SELECT to_tsvector('simple','Try not to become a man of success, but rather try to become a man of value');
to_tsvector
---------------------------------------------------------------------------------------------------------------------
'a':5,14 'become':4,13 'but':9 'man':6,15 'not':2 'of':7,16 'rather':10 'success':8 'to':3,12 'try':1,11 'value':17
(1 row) test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value');
to_tsvector
---------------------------------------------------------------------------------------------------------------------
'a':5,14 'become':4,13 'but':9 'man':6,15 'not':2 'of':7,16 'rather':10 'success':8 'to':3,12 'try':1,11 'value':17
(1 row)

这里可以看到,如果词干分析器是english ,会采取词干标准化的过程;而simple 只是转换成小写。默认是 simple。

test=# show default_text_search_config;
default_text_search_config
----------------------------
pg_catalog.simple
(1 row)

2、标准化过程

标准化过程会完成以下操作:

  1. 总是把大写字母换成小写的
  2. 也经常移除后缀(比如英语中的s,es和ing等),这样可以搜索同一个字的各种变体,而不是乏味地输入所有可能的变体。
  3. 数字表示词位在原始字符串中的位置,比如“man"出现在第6和15的位置上。
  4. to_tesvetor的默认配置的文本搜索是“英语“。它会忽略掉英语中的停用词(stopword,译注:也就是am is are a an等单词)。

3、tsvector搜索

test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value') @@ 'become';
?column?
----------
t
(1 row) test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value') @@ 'becom';
?column?
----------
f
(1 row)

test=# select 'become'::tsquery,to_tsquery('become'),to_tsquery('english','become');
tsquery | to_tsquery | to_tsquery
----------+------------+------------
'become' | 'become' | 'becom'
(1 row)

to_tsquery 也会进行标准化转换,在搜索时必须用 to_tsquery,确保数据不会因为标准化转换而搜索不到。

4、逻辑操作

test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value') @@ to_tsquery('become');
?column?
----------
t
(1 row) test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value') @@ to_tsquery('!become');
?column?
----------
f
(1 row) test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value') @@ to_tsquery('tri & become');
?column?
----------
t
(1 row) test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value') @@ to_tsquery('Try & !becom');
?column?
----------
f
(1 row) test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value') @@ to_tsquery('Try | !become');
?column?
----------
t
(1 row)

5、可以用 :* 表示某词开始字符

test=# SELECT to_tsvector('Try not to become a man of success, but rather try to become a man of value') @@ to_tsquery('bec:*');
?column?
----------
t
(1 row)

6、其他语言支持

test=# SELECT to_tsvector('simple','Try not to become a man of success, but rather try to become a man of value');
to_tsvector
---------------------------------------------------------------------------------------------------------------------
'a':5,14 'become':4,13 'but':9 'man':6,15 'not':2 'of':7,16 'rather':10 'success':8 'to':3,12 'try':1,11 'value':17
(1 row) test=# SELECT to_tsvector('english','Try not to become a man of success, but rather try to become a man of value') ;
to_tsvector
----------------------------------------------------------------------
'becom':4,13 'man':6,15 'rather':10 'success':8 'tri':1,11 'valu':17
(1 row)
^
test=# SELECT to_tsvector('french','Try not to become a man of success, but rather try to become a man of value') ;
to_tsvector
-----------------------------------------------------------------------------------------------------------------
'a':5,14 'becom':4,13 'but':9 'man':6,15 'not':2 'of':7,16 'rath':10 'success':8 'to':3,12 'try':1,11 'valu':17
(1 row)
^
test=# SELECT to_tsvector('french'::regconfig,'Try not to become a man of success, but rather try to become a man of value') ;
to_tsvector
-----------------------------------------------------------------------------------------------------------------
'a':5,14 'becom':4,13 'but':9 'man':6,15 'not':2 'of':7,16 'rath':10 'success':8 'to':3,12 'try':1,11 'valu':17
(1 row)

simple并不忽略禁用词表,它也不会试着去查找单词的词根。使用simple时,空格分割的每一组字符都是一个语义;simple 只做了小写转换;对于数据来说,simple文本搜索配置项很实用。 

二、中文检索

在开始介绍中文检索前,我们先来看个例子:

test=# select to_tsvector('人大金仓致力于提供高可靠的数据库产品');
to_tsvector
------------------------------------------
'人大金仓致力于提供高可靠的数据库产品':1

因为内置的分词器是按空格分割的,而中文间没有空格,因此,整句话就被看做一个分词。

1、创建中文搜索插件

create extension zhparser;
create text search configuration zhongwen_parser (parser = zhparser);
alter text search configuration zhongwen_parser add mapping for n,v,a,i,e,l,j with simple;

上面 for 后面的字母表示分词的token,上面的token映射只映射了名词(n),动词(v),形容词(a),成语(i),叹词(e),缩写(j) 和习用语(l)6种,这6种以外的token全部被屏蔽。词典使用的是内置的simple词典。具体的token 如下:

test=# select ts_token_type('zhparser');
ts_token_type
------------------------
(97,a,adjective)
(98,b,differentiation)
(99,c,conjunction)
(100,d,adverb)
(101,e,exclamation)
(102,f,position)
(103,g,root)
(104,h,head)
(105,i,idiom)
(106,j,abbreviation)
(107,k,tail)
(108,l,tmp)
(109,m,numeral)
(110,n,noun)
(111,o,onomatopoeia)
(112,p,prepositional)
(113,q,quantity)
(114,r,pronoun)
(115,s,space)
(116,t,time)
(117,u,auxiliary)
(118,v,verb)
(119,w,punctuation)
(120,x,unknown)
(121,y,modal)
(122,z,status)
(26 rows)

2、查看pg_ts_config

创建text search configuration 后,可以在视图pg_ts_config 看到如下信息:

test=# select * from pg_ts_config;
oid | cfgname | cfgnamespace | cfgowner | cfgparser
-------+-----------------+--------------+----------+-----------
3748 | simple | 11 | 10 | 3722
13265 | arabic | 11 | 10 | 3722
13267 | danish | 11 | 10 | 3722
13269 | dutch | 11 | 10 | 3722
13271 | english | 11 | 10 | 3722
13273 | finnish | 11 | 10 | 3722
13275 | french | 11 | 10 | 3722
13277 | german | 11 | 10 | 3722
13279 | hungarian | 11 | 10 | 3722
13281 | indonesian | 11 | 10 | 3722
13283 | irish | 11 | 10 | 3722
13285 | italian | 11 | 10 | 3722
13287 | lithuanian | 11 | 10 | 3722
13289 | nepali | 11 | 10 | 3722
13291 | norwegian | 11 | 10 | 3722
13293 | portuguese | 11 | 10 | 3722
13295 | romanian | 11 | 10 | 3722
13297 | russian | 11 | 10 | 3722
13299 | spanish | 11 | 10 | 3722
13301 | swedish | 11 | 10 | 3722
13303 | tamil | 11 | 10 | 3722
13305 | turkish | 11 | 10 | 3722
16390 | parser_name | 2200 | 10 | 16389
24587 | zhongwen_parser | 2200 | 10 | 16389

3、使用中文分词

test=# select to_tsvector('zhongwen_parser','人大金仓致力于提供高可靠的数据库产品');
to_tsvector
------------------------------------------------------------------
'产品':7 '人大':1 '可靠':5 '提供':3 '数据库':6 '致力于':2 '高':4

4、contains 函数

test=# \df+ contains
List of functions
Schema | Name | Result data type | Argument data types | Type | Volatility | Parallel | Owner | Security | Access privileges | Language | Source code
| Description
--------+----------+------------------+---------------------+------+------------+----------+--------+----------+-------------------+----------+------------------------------------------+-------------
sys | contains | boolean | text, text | func | immutable | safe | system | invoker | | sql | select to_tsvector($1) @@ to_tsquery($2) |
sys | contains | boolean | text, text, integer | func | immutable | safe | system | invoker | | sql | select to_tsvector($1) @@ to_tsquery($2) |
sys | contains | boolean | text, tsquery | func | immutable | safe | system | invoker | | sql | select $1::tsvector @@ $2 |
sys | contains | boolean | tsvector, text | func | immutable | safe | system | invoker | | sql | select $1 @@ $2::tsquery |
sys | contains | boolean | tsvector, tsquery | func | immutable | safe | system | invoker | | sql | select $1 @@ $2 |

默认contains 函数使用的是空格分词解析器,因此,无法使用contains 进行中文判断

test=# select contains('人大金仓致力于提供高可靠的数据库产品','产品');
contains
----------
f

KingbaseES 全文检索功能介绍的更多相关文章

  1. .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍

    Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...

  2. 微信小程序产品定位及功能介绍

    产品定位及功能介绍 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 小程序注册 注册小程序帐号 在微信公众平台官网首页(mp.weixin.qq ...

  3. 带你走近AngularJS - 基本功能介绍

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  4. MWeb 1.4 新功能介绍一:引入文件夹到 MWeb 中管理,支持 Octpress、Jekyll 等静态博客拖拽插入图片和实时预览

    之前在 MWeb 中打开非文档库中的 Markdown 文档,如果文档中有引用到本机图片,是没办法在 MWeb 中显示出来和预览的.这是因为 Apple 规定在 Mac App Store(MAS) ...

  5. Joomla软件功能介绍与开源程序大比拼Joomla,wordpress,Drupal哪个好?

    Joomla 软件功能介绍:    Joomla!是一套在国外相当知名的内容管理系统 (Content Management System, CMS),它属于Portal(企业入口网站)类型,顾名思义 ...

  6. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  7. python中列表、元组、字典内部功能介绍

    一.列表(list) 常用功能的介绍:

  8. 网页引导:jQuery插件实现的页面功能介绍引导页效果

    现在很多网站不仅是介绍,更多的是有一些功能,怎么样让客户快速的知道网站有哪些功能呢?这里pagewalkthrough.js插件能帮我们实现,它是一个轻量级的jQuery插件,它可以帮助我们创建一个遮 ...

  9. 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍

    回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...

随机推荐

  1. 基于SqlSugar的开发框架循序渐进介绍(9)-- 结合Winform控件实现字段的权限控制

    字段的权限控制,一般就是控制对应角色人员对某个业务对象的一些敏感字段的可访问性:包括可见.可编辑性等处理.本篇随笔结合基于SqlSugar的开发框架进行的字段控制管理介绍. 在设计字段权限的时候,我们 ...

  2. SAP 维护视图隐藏字段

    PBO:     MODULE reset_index. 其中ZDT_BPC002_T02 为视图名称. MODULE reset_index OUTPUT. FIELD-SYMBOLS:<fs ...

  3. java web 三层架构设计

    界面层(表示层):用户看得到的,可以通过此与服务器交互 业务逻辑层:处理业务逻辑. 数据访问层:操作数据存储文件

  4. umask默认权限及特殊权限

    1. linux系统中,创建一个新的文件或者目录的时候,新的文件或目录都会有默认的访问权限,umask命令与文件和目录的默认访问权限有关. 用户创建一个文件,文件的默认权限为 -rw-rw-rw-(6 ...

  5. bat-winget-win平台的软件包管理器

    win10 1709版本以后 引入的包管理器,如果不可用 需要 更新一下 应用安装程序. winget命令的功能  常用的就  安装 卸载 更新  . 卸载 使用中如果提示 策略 不允许,可执行下面命 ...

  6. 有关于weiphp2.00611上传sae的一些注意(图片上传解决方案)

    一.安装中注意的事项  安装时使用的系统为weiphp2.0611    版本     1.将所有文件上传到代码库中     2.按照步骤进行安装weiphp,注意在数据库导入的时候需要手动导入.  ...

  7. ubuntu20.04安装测试uhttpd

    uhttpd是openwrt上运行一个高效小型Http服务,支持cgi, lua等特性.可以直接通过snap方式安装,如果是16.04,18.04或者20.04,snap已经默认安装了:如果是其它版本 ...

  8. 【docker专栏4】使用docker安装nginx提供web服务

    一般学习一项技术,会先用一个最简单的例子或最典型的例子来向大家讲解入门内容,所以此文为大家介绍使用docker安装nginx容器服务.从基础使用的角度来讲,此文几乎涵盖了docker最核心的内容:镜像 ...

  9. 控制台字体怎么改为console?

    windows控制台窗口在中文版下没有console字体,如果要使用console的话就必须先将窗口转换为英文版. 1.win+R进入运行窗口,然后cmd进入命令窗口 2.在命令行窗口输入 chcp ...

  10. ASP.NET Core 6.0 基于模型验证的数据验证

    1 前言 在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的.前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验:后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性 ...