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. 机械硬盘和ssd固态硬盘的原理对比分析

    固态硬盘和机械硬盘的区别 机械硬盘 磁头是不是直接和盘片接触的呢 磁盘中有几个盘片 机械硬盘的工作原理 固态硬盘的寻址方式 SMR叠瓦式真的比PMR优秀吗 固态硬盘 主控芯片 闪存颗粒 缓存单元 固态 ...

  2. 如何修改servlet的创建时机?

    在xml中使用<load-on-startup>标签 当标签里为正整数时意味着服务器启动时创建 当为负数时(默认负数)意味着第一次访问时创建 顺带说一下service设置变量时的问题尽量在 ...

  3. kubernetes集群简单实例搭建

    systemctl stop firewalld && systemctl disable firewalldvim /etc/selinux/configSELINUX=disabl ...

  4. Linux shell脚本基础

    程序的组成: 程序:算法+数据结构 数据:程序处理的目标 数据结构:相互之间存在一种或多种特定关系的数据元素的集合 算法:处理数据的方式 编程风格: 面向对象:把所有的操作都转化为对象的方式. 面向过 ...

  5. 用WindowsAppSDK(WASDK)优雅的开发上位机应用

    C#开发上位机应用的一些选择 如果你不想看介绍,可以直接跳到优雅开发示例那里. 1. WASDK(WinUI 3) Windows 应用 SDK 是一组新的开发人员组件和工具,它们代表着 Window ...

  6. 用python随随便便做一个二维码叭~~~

    Python是目前最好的编程语言之一.由于其可读性和对初学者的友好性,已被广泛使用. 那么要想学会并掌握Python,可以实战的练习项目是必不可少的. 接下来,我将给大家介绍非常实用的Python项目 ...

  7. nginx启动失败/报错(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket...permissions) nginx启动失败

    出现这个问题是因为80端口被占用了 1.cmd输入命令netstat -aon|findstr "80" 2..查看80端口 16356对应的任务 输入命令 tasklist|fi ...

  8. SLF4J 日志门面

    目录 01.简单介绍 02.日志级别 03.入门案例 03.动态打印 04.异常打印 05.日志集成 06.集成 logback 07.集成 slf4j-nop 08.集成 log4j 09.集成 j ...

  9. 自己写雪花算法IdWorker

    package com.aiyusheng.shopping.util; import java.lang.management.ManagementFactory; import java.net. ...

  10. MATLAB复习资料——浙商大管工学院适用

    包含12套复习卷,课堂PPT 下载链接:MATLAB练习模拟题库(12套).pdf - 蓝奏云 (lanzoub.com)