ftutilx是一个KingbaseES的扩展,主要用于从存储流版式文件的blob类型字段中抽取文本内容。其中blob类型字段内容可以包括 pdf、doc、docx、wps、xls、xlsx、ppt和pptx格式文件。ftutilx插件不支持加密文件格式。
在使用ftutilx之前,需要将他添加到kingbase.conf文件的shared_preload_libraries中,并重启KingbaseES数据库。
shared_preload_libraries = 'ftutilx' # (change requires restart)
CREATE EXTENSION ftutilx;
ftutilx.max_string_length
抽取结果最大长度,默认值:128M,该参数设置后立即生效。
ftutilx.jvm_option_string
JVM初始化参数,默认值:"-Xmx1024m,-Xms1024m,-Xmn256m,-XX:MetaspaceSize=64m,-XX:MaxMetaspaceSize=128m,-XX:CompressedClassSpaceSize=256m",该参数只在会话进程中首次调用extracttext函数创建JVM时生效,再次设置该参数不再有效。
在数据库默认扩展加载机制下,在一个会话中创建扩展以后,在新的会话开始后并不是立即加载扩展动态库,而是直到首次调用扩展中的接口时才会加载扩展动态库,导致在这之前在新会话中设置扩展参数无效。 解决方法是:修改数据库配置文件中的shared_preload_libraries或者session_preload_libraries两个参数之一,使参数值包括ftutilx,即可在新会话开始后立即加载ftutilx扩展动态库,并设置扩展参数。
ftutilx插件提供了extracttext函数用于抽取存储在blob类型字段内的文件内容。extracttext函数接受一个代表文件内容的blob类型参数,返回抽取的text类型文本内容。
CREATE TABLE tab (title text, body blob);
INSERT INTO tab VALUES ('test.doc', blob_import('/home/test/data.doc'));
SELECT title, length(extracttext(body)) FROM tab;
方案一:
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION zhparsercfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION zhparsercfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
CREATE EXTENSION ftutilx;
CREATE TABLE tab (title text, body blob);
ALTER TABLE tab ADD COLUMN content text GENERATED ALWAYS AS (extracttext(body)) STORED;
CREATE INDEX tab_idx ON tab USING GIN (to_tsvector('zhparsercfg', content));
INSERT INTO tab VALUES ('test.doc', blob_import('/home/test/data.doc'));
SELECT title FROM tab WHERE to_tsvector('zhparsercfg', content) @@ to_tsquery('日志');
方案二:
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION zhparsercfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION zhparsercfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
CREATE EXTENSION ftutilx;
CREATE TABLE tab (title text, body blob);
ALTER TABLE tab ADD COLUMN tab_idx_col tsvector GENERATED ALWAYS AS (to_tsvector('zhparsercfg', extracttext(body))) STORED;
CREATE INDEX tab_idx ON tab USING GIN (tab_idx_col);
INSERT INTO tab VALUES ('test.doc', blob_import('/home/test/data.doc'));
SELECT title FROM tab WHERE tab_idx_col @@ to_tsquery('日志');
4.2. 注意事项
1) ftutilx需要依赖于jre-1.8.0运行时环境,部署后需要设置LD_LIBRARY_PATH系统环境变量包含jre-1.8.0的libjvm.so路径。
2) ftutilx.max_string_length 参数用于配置抽取结果的最大长度,但由于tsvector目前最大支持(1M-1),所以extracttext结合to_tsvector使用时,分词结果大小不能超过(1M-1)。
3) ftutilx需要创建JVM,JVM会占用较多内存。虽然调整ftutilx.jvm_option_string的-Xmx可以限制JVM的内存占用,但过小的-Xmx值会导致大文件解析时JVM发生内存不足异常。
4) 基于前面的全文检索联合使用方案,在系统内存较少的环境中,需要限制并行插入数据的会话进程数量,以免系统内存被耗尽。
drop extension ftutilx;