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 进行分词。

四、注意事项

  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. koa2基于stream(流)进行文件上传和下载

    阅读目录 一:上传文件(包括单个文件或多个文件上传) 二:下载文件 回到顶部 一:上传文件(包括单个文件或多个文件上传) 在之前一篇文章,我们了解到nodejs中的流的概念,也了解到了使用流的优点,具 ...

  2. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  3. C++之流与文件

    C++中,输入输出采用流来进行,例如iostream库中的 cin 和 cout .对文件进行读写操作也使用流.可以将文件与流关联起来,然后对文件进行操作.要将流与文件关联起来,必须像声明变量那样声明 ...

  4. java io流 对文件夹的操作

    java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...

  5. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...

  6. java io流(字符流) 文件打开、读取文件、关闭文件

    java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...

  7. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  8. [Java] 通过文件流拷贝文件

    package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  9. QT visual stuido 集成插件不能打开ui文件的解决方法(去掉xml的UTF8标记)

    QT visual stuido 集成插件不能打开ui文件的解决方法 visual studio里不能打开这个ui文件,出现warning等解决方法是:于是将<?xml version=&quo ...

随机推荐

  1. Vue.js与Node.js一起打造一款属于自己的音乐App(收藏)

    更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/118755888

  2. ConcurrentHashMap深入剖析(基于JDK1.7)

    最近有点时间,翻了翻ConcurrentHashMap的源码学习了一下,对我自己认为比较重要的一些方法进行了学习,添加了一些必要的注释,拿出来与园子的小伙伴分享一下,有说的不对的地方,还请各位批评指正 ...

  3. Python实现循环的最快方式,for和while到底谁更强

    写在前面的一些P话: 大家都知道,效率不管是对于工作还是学习都是十分重要的.当然,Python也是需要效率的.众所周知,Python 不是一种执行效率较高的语言.此外在任何语言中,循环都是一种非常消耗 ...

  4. [JLOI2015]装备购买 题解 / 实数线性基学习笔记

    题目链接 看这道题之前,以为线性基只是支持异或的操作... 那么,我认为这道题体现出了线性基的本质: 就是说如何用最小的一个集合去表示所有出现的装备. 我们假设已经会使用线性基了,那么对于这道题该怎么 ...

  5. 2022-07-12 第六组 润土 JavaScript02学习笔记

    1.循环语句 for循环: for(let i=0;i<10;i++){循环体} while循环: while(i<10){循环体}: do... while...循环: do{循环体}w ...

  6. Spring知识点详解

    1.Spring 概述 1.1.Spring 的概念和特点 Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的开源容器框架,它是由 Rod Johnson(音乐学博士)所创建,其核心 ...

  7. Dubbo源码(三) - 服务导出(生产者)

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 在了解了Dubbo SPI后,我们来了解下Dubbo服务导出的过程. Dubbo的配置是通过Du ...

  8. 多表查询_练习1&练习2&练习3

    准备表: -- 部门表 CREATE TABLE dept ( id INT PRIMARY KEY PRIMARY KEY, -- 部门id dname VARCHAR(50), -- 部门名称 l ...

  9. [Linux] 如何在 Linux 电脑上制作专业的视频教程

    目录 前言 1.软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件 2.视频教程制作 3.效果 参考链接 前言 博主使用 Arch Linux ...

  10. MAUI Blazor 权限经验分享 (定位,使用相机)

    入门文章 Blazor Hybrid / MAUI 简介和实战 https://www.cnblogs.com/densen2014/p/16240966.html 在 Mac 上开发 .NET MA ...