Oracle 支持流版式文件的全文检索,而原生的PostgreSQL是不支持流版式文件全文检索的。KingbaseES 通过ftutilx 插件将流版式文件转换成文本文件,从而支持流版式文件全文检索。

一、准备数据

1、创建TXT和docx文件

分别创建文本文件和word文件,内容如下:

  oid  |  cfgname   | cfgnamespace | cfgowner | cfgparser
-------+------------+--------------+----------+-----------3748 | simple     |           11 |       10 |      372213288 | arabic     |           11 |       10 |      372213290 | danish     |           11 |       10 |      372213292 | dutch      |           11 |       10 |      372213294 | english    |           11 |       10 |      372213296 | finnish    |           11 |       10 |      372213298 | french     |           11 |       10 |      372213300 | 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 EXTENSIONtest=# \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 进行分词。

四、注意事项

  1. ftutilx 也可以针对中文的流版式文件转换成文本格式,因此,配合 to_tsvector 也可以支持中文全文检索
  2. ftutilx 需要依赖于jre-1.8.0 运行时环境,部署后需要设置LD_LIBRARY_PATH 系统环境变量包含jre-1.8.0的libjvm.so 路径。
  3. ftutilx.max_string_length 参数用于配置抽取结果的最大长度,但由于tsvector 目前最大支持(1M-1),所以extracttext 结合to_tsvector 使用时,分词结果大小不能超过(1M-1)。
  4. ftutilx 需要创建JVM,JVM 会占用较多内存。虽然调整ftutilx.jvm_option_string 的-Xmx 可以限制JVM 的内存占用,但过小的-Xmx 值会导致大文件解析时JVM 发生内存不足异常。
  5. 由于通过ftutilx 进行流版式文件转换性能较慢,为提高检索性能,可以在表中添加存储列,用于存储内容抽取结果或者词位列表。如:ALTER TABLE tab ADD COLUMN tab_idx_col tsvector GENERATED ALWAYS AS (to_tsvector('zhparsercfg', extracttext(body))) STORED;

通过ftutilx 插件实现流版式文件全文检索相关推荐

  1. 基于poi包的流式文件和版式文件操作工具

    说明 该工具类是基于poi包的流式文件(如doc.excel等)和版式文件(如pdf.ofd等)的操作工具类. 因为自己在开发相关功能的时候踩过一些坑,网上也很多例子都不适用,不是jar版本不对,要么 ...

  2. Nginx增加m3u8流视频文件功能模块 推流和拉流

    Nginx增加m3u8流视频文件功能模块 推流和拉流 FastDFS分布式文件系统安装和配置_亲测成功 ./configure --prefix=/u06/data/apps/nginx-rtmp \ ...

  3. vue element 导出blob后台文件流xlsx文件自动下载(且规避乱码)

    通常情况blob后台文件流都是如下图这样让人崩溃的乱码 <el-buttontype="success"@click.stop="handleExport" ...

  4. [转] linux系统文件流、文件描述符与进程间关系详解

    http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括:     ...

  5. java缓冲流 复制文件_java使用缓冲流复制文件的方法

    本文实例为大家分享了java使用缓冲流复制文件的具体代码,供大家参考,具体内容如下 [1] 程序设计 /*------------------------------- 1.缓冲流是一种处理流,用来加 ...

  6. linux基于流的文件操作

    1 打开流的函数 FIEL * fopen(const char * restrict pathname,const char* restrict type) FILE *fdopen(int fil ...

  7. java输出流输入流的使用_Java中的IO流之文件输入输出流

    Java中的IO流之文件输入输出流 1.文件流介绍 文件流是以字节为单位进行读写文件的,所以属于字节流,并且是低级流.文件流位于java.io包下. 输入输出流分别是FileInputSteam和Fi ...

  8. 使用字符流 创建文件 写入文件 复制文件

    import java.io.*; /**    * 使用字符流创建文件复制文件  * 在盘符中文件夹  * 在文件夹中添加文件  * 在文件中写文字  *   复制文件  * */ public c ...

  9. 字节流和字符流复制文件内容实例

    字节流和字符流复制文件内容实例 字节流: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputS ...

最新文章

  1. python 修改列表中的元素
  2. 计算机网络教会我们什么,日久见人心现实教会了我们什么叫人心的说说
  3. Chrome 正在测试标签页的预览功能
  4. Centos网络驱动
  5. python中赋值运算符有哪些_Python代码中有哪些赋值运算符呢?
  6. java 双等号(==) 与equals方法的介绍和区别
  7. AWT_Swing_单选框(Java)
  8. ssh 登录linux xsell 登录Linux 提示用户密钥登录怎么解决
  9. redis配置文件下载
  10. Java实现进制转换方法汇总
  11. python匹配字符串以结尾_Python-字符串开头或结尾匹配
  12. java 6面骰子_Java实现的简单掷骰子游戏示例
  13. 10.24程序员节疑问:沈从文的编程功底应该很厉害吧?
  14. 拼多多校招----大整数相乘(python)
  15. AD软件生成gerb文件方法参考
  16. ckeditor富文本编辑器的使用和图片上传,复制粘贴图片上传
  17. {“errcode“:48001,“errmsg“:“api unauthorized}
  18. 5.1 傅里叶展开,傅里叶级数推导
  19. C++11并发与多线程笔记(10) future其他成员函数、shared_future、atomic
  20. 2105_TIP_DeepQTMT:一种VVC帧内编码块划分的深度学习方法

热门文章

  1. 附pdf下载 | 动手学习深度学习和GAN电子书
  2. 类的默认成员函数、赋值运算符重载
  3. sort()函数的用法
  4. 微信平台之坐标系与位置
  5. jQuery 属性与样式
  6. UML 关系-画图(箭头,符号)对照表
  7. 阿里云服务器选固定带宽划算还是按使用流量更便宜?来计算一下!
  8. 阿里巴巴并购安全公司翰海源
  9. 海尔linux系统密码,海尔路由器密码忘记了怎么办?
  10. hexo搭建自己的博客并部署至免费的github服务器教程