通过ftutilx 插件实现流版式文件全文检索
2024-09-01 20:30:12
Oracle 支持流版式文件的全文检索,而原生的PostgreSQL是不支持流版式文件全文检索的。KingbaseES 通过ftutilx 插件将流版式文件转换成文本文件,从而支持流版式文件全文检索。
一、准备数据
1、创建TXT和docx文件
分别创建文本文件和word文件,内容如下:
oid | cfgname | cfgnamespace | cfgowner | cfgparser
-------+------------+--------------+----------+-----------
3748 | simple | 11 | 10 | 3722
13288 | arabic | 11 | 10 | 3722
13290 | danish | 11 | 10 | 3722
13292 | dutch | 11 | 10 | 3722
13294 | english | 11 | 10 | 3722
13296 | finnish | 11 | 10 | 3722
13298 | french | 11 | 10 | 3722
13300 | german | 11 | 10 | 3722
2、将两个文件存入blob和clob
create table ts_test(txt_clob clob,txt_blob blob,doc_clob clob,doc_blob blob);
insert into ts_test values(clob_import('/home/kb21/temp.txt'),blob_import('/home/kb21/temp.txt'),clob_import('/home/kb21/temp.docx'),blob_import('/home/kb21/temp.docx'));
ERROR: invalid byte sequence for encoding "UTF8": 0x00
注意:这里把docx 用clob 导入时报错。
create table ts_test(txt_clob clob,txt_blob blob,doc_blob blob);
insert into ts_test values(clob_import('/home/kb21/temp.txt','UTF8'),blob_import('/home/kb21/temp.txt'),blob_import('/home/kb21/temp.docx'));
二、文本格式的全文检索
test=# select count(*) from ts_test where to_tsvector(txt_clob) @@ to_tsquery('simple');
count
-------
1
(1 row) test=# select count(*) from ts_test where to_tsvector(txt_blob) @@ to_tsquery('simple');
count
-------
1
(1 row) test=# select count(*) from ts_test where to_tsvector(doc_blob) @@ to_tsquery('simple');
count
-------
0
(1 row)
结论:对于文本类型,不管存储数据类型的是clob,还是blob,全文检索都可以搜索到;对于docx类型,由于是流版式格式,全文检索无法使用。
三、流版式格式的全文检索
1、配置参数
shared_preload_libraries = 'ftutilx, ......'
2、设置LD_LIBRARY_PATH
ftutilx 依赖于 jre-1.8.0 运行时环境,部署后需要设置LD_LIBRARY_PATH 系统环境变量包含jre-1.8.0的libjvm.so 路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/etc/alternatives/jre_1.8.0/lib/amd64/server
3、测试流版式文件检索
test=# create extension ftutilx;
CREATE EXTENSION test=# \dx+ ftutilx
Objects in extension "ftutilx"
Object description
----------------------------
function extracttext(blob)
(1 row) test=# select extracttext(doc_blob) from ts_test;
extracttext
------------------------------------------------------------
oid | cfgname | cfgnamespace | cfgowner | cfgparser +
-------+------------+--------------+----------+-----------+
3748 | simple | 11 | 10 | 3722 +
13288 | arabic | 11 | 10 | 3722 +
13290 | danish | 11 | 10 | 3722 +
13292 | dutch | 11 | 10 | 3722 +
13294 | english | 11 | 10 | 3722 +
13296 | finnish | 11 | 10 | 3722 +
13298 | french | 11 | 10 | 3722 + test=# select to_tsvector(extracttext(doc_blob)) from ts_test;
to_tsvector
--------------------------------------------------------------------------------------------------------------------------------------------------------------- '10':9,14,19,24,29,34,39 '11':8,13,18,23,28,33,38 '13288':11 '13290':16 '13292':21 '13294':26 '13296':31 '13298':36 '3722':10,15,20,25,30,35,40 '3748':6 'arab
ic':12 'cfgname':2 'cfgnamespace':3 'cfgowner':4 'cfgparser':5 'danish':17 'dutch':22 'english':27 'finnish':32 'french':37 'oid':1 'simple':7
(1 row)
可以看到, extracttext 的作用是将流版式的数据抽取成文本格式,然后再通过to_tsvector 进行分词。
四、注意事项
- ftutilx 也可以针对中文的流版式文件转换成文本格式,因此,配合 to_tsvector 也可以支持中文全文检索
- ftutilx 需要依赖于jre-1.8.0 运行时环境,部署后需要设置LD_LIBRARY_PATH 系统环境变量包含jre-1.8.0的libjvm.so 路径。
- ftutilx.max_string_length 参数用于配置抽取结果的最大长度,但由于tsvector 目前最大支持(1M-1),所以extracttext 结合to_tsvector 使用时,分词结果大小不能超过(1M-1)。
- ftutilx 需要创建JVM,JVM 会占用较多内存。虽然调整ftutilx.jvm_option_string 的-Xmx 可以限制JVM 的内存占用,但过小的-Xmx 值会导致大文件解析时JVM 发生内存不足异常。
- 由于通过ftutilx 进行流版式文件转换性能较慢,为提高检索性能,可以在表中添加存储列,用于存储内容抽取结果或者词位列表。如:ALTER TABLE tab ADD COLUMN tab_idx_col tsvector GENERATED ALWAYS AS (to_tsvector('zhparsercfg', extracttext(body))) STORED;
最新文章
- AlertDialog之常见对话框(单选对话框、多选对话框、进度条对话框)
- android倒计时(整理)
- C语言中常量
- 【BZOJ】【1061】【NOI2008】志愿者招募
- Excel 隐藏功能区命令
- java web工程发布以及解决tomcat闪退
- cocos2d-x项目过程记录(ios和android设备的适配)
- Android模拟器设置竖屏
- CF 460C Present 【DP+】主意
- 项目中处理android 6.0权限管理问题
- JS中Node节点总结
- iOS中 读取相册,调用系统相机 技术分享
- angular2 脏检查机制
- 路由器DHCP服务及DHCP中继
- Lucene 学习-安装 Elasticsearch 服务器
- ElasticSearch 使用小结
- cocos2dx中调用TinyXml读取xml配置文件 || cocos2d-x 中跨平台tinyxml读取xml文件方式
- Springboot时间参数格式化
- 软件开发中IT用语-日文和英文对照版
- MYSQL的longtext字段能放多少数据?
热门文章
- 「快速学习系列」我熬夜整理了Vue3.x响应性API
- SprinigBoot自定义Starter
- 【Redis 系列】redis 学习十六,redis 字典(map) 及其核心编码结构
- centos8 编译安装 httpd-2.4
- 又拍云 Redis 的改进之路
- 活动报名 | 如何基于开源项目 Tapdata PDK,快速完成数据源和目标的开发?
- java包机制
- HDFS、Yarn、Hive…MRS中使用Ranger实现权限管理全栈式实践
- docker仓库之harbor的基本使用(二)
- Vue中关于this指向的问题