通过ftutilx 插件实现流版式文件全文检索
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;
通过ftutilx 插件实现流版式文件全文检索的更多相关文章
- koa2基于stream(流)进行文件上传和下载
阅读目录 一:上传文件(包括单个文件或多个文件上传) 二:下载文件 回到顶部 一:上传文件(包括单个文件或多个文件上传) 在之前一篇文章,我们了解到nodejs中的流的概念,也了解到了使用流的优点,具 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- C++之流与文件
C++中,输入输出采用流来进行,例如iostream库中的 cin 和 cout .对文件进行读写操作也使用流.可以将文件与流关联起来,然后对文件进行操作.要将流与文件关联起来,必须像声明变量那样声明 ...
- java io流 对文件夹的操作
java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...
- java io流 创建文件、写入数据、设置输出位置
java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...
- java io流(字符流) 文件打开、读取文件、关闭文件
java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...
- C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭
迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...
- [Java] 通过文件流拷贝文件
package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- QT visual stuido 集成插件不能打开ui文件的解决方法(去掉xml的UTF8标记)
QT visual stuido 集成插件不能打开ui文件的解决方法 visual studio里不能打开这个ui文件,出现warning等解决方法是:于是将<?xml version=&quo ...
随机推荐
- Vue.js与Node.js一起打造一款属于自己的音乐App(收藏)
更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/118755888
- ConcurrentHashMap深入剖析(基于JDK1.7)
最近有点时间,翻了翻ConcurrentHashMap的源码学习了一下,对我自己认为比较重要的一些方法进行了学习,添加了一些必要的注释,拿出来与园子的小伙伴分享一下,有说的不对的地方,还请各位批评指正 ...
- Python实现循环的最快方式,for和while到底谁更强
写在前面的一些P话: 大家都知道,效率不管是对于工作还是学习都是十分重要的.当然,Python也是需要效率的.众所周知,Python 不是一种执行效率较高的语言.此外在任何语言中,循环都是一种非常消耗 ...
- [JLOI2015]装备购买 题解 / 实数线性基学习笔记
题目链接 看这道题之前,以为线性基只是支持异或的操作... 那么,我认为这道题体现出了线性基的本质: 就是说如何用最小的一个集合去表示所有出现的装备. 我们假设已经会使用线性基了,那么对于这道题该怎么 ...
- 2022-07-12 第六组 润土 JavaScript02学习笔记
1.循环语句 for循环: for(let i=0;i<10;i++){循环体} while循环: while(i<10){循环体}: do... while...循环: do{循环体}w ...
- Spring知识点详解
1.Spring 概述 1.1.Spring 的概念和特点 Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的开源容器框架,它是由 Rod Johnson(音乐学博士)所创建,其核心 ...
- Dubbo源码(三) - 服务导出(生产者)
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 在了解了Dubbo SPI后,我们来了解下Dubbo服务导出的过程. Dubbo的配置是通过Du ...
- 多表查询_练习1&练习2&练习3
准备表: -- 部门表 CREATE TABLE dept ( id INT PRIMARY KEY PRIMARY KEY, -- 部门id dname VARCHAR(50), -- 部门名称 l ...
- [Linux] 如何在 Linux 电脑上制作专业的视频教程
目录 前言 1.软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件 2.视频教程制作 3.效果 参考链接 前言 博主使用 Arch Linux ...
- MAUI Blazor 权限经验分享 (定位,使用相机)
入门文章 Blazor Hybrid / MAUI 简介和实战 https://www.cnblogs.com/densen2014/p/16240966.html 在 Mac 上开发 .NET MA ...