-
OBS 是否有提供 全文检索 的能力?对每个对象的自定义元数据是否可以在查询的时候作为条件进行过滤?
-
九云图DocSDK智能文档格式转换系统(九云图DocSDK Server,www.docsdk.com ),是一个服务器软件,提供了开发接口(API),能够解决各类文档格式转换问题。用户通过部署该产品,可以在软件产品中,快速实现涉及文档格式转换的相关功能,提高研发效率。下面是一个“通用文档全文检索系统”产品技术方案架构示意图: 该方案部署了九云图DocSDK Server,用来支持非结构化文档。主要作用如下:1. 格式解析。对所支持的Office/WPS/ODF/CAD/PDF等各类文档进行格式解析,将文档的非结构化信息解析成结构化的 JSON 格式,用于建立索引;2. 版面重建。一些绝对定位的文档中,缺少准确的段落描述,比如有的文档的豆腐块版式,文本PDF,文字是以零散方式描述的位置信息。这种方式预览阅读时没有问题,视觉效果上具有段落区分。但程序在进行全文检索时,就会出现错漏情况。九云图DocSDK通过智能算法,根据文字位置、字体、内容的相关信息,准确划分段落,实现版面重建;3. 表格识别。表格里的信息天然具备结构化特征,很多情况检索时需要利用这类特征。但有些文档表面看起来是表格,实际并没有行列关系的描述,这时就需要通过表格识别算法,将行列关系还原出来;4. 在线展现。检索结果需要在线展现,九云图DocSDK对各类文档提供了三种在线展现形式,图片、传统HTML和HTML5。图片方式通用性好,但缩放时存在不清晰现象。传统HTML可以支持交互,能实现内容标注、编辑等需求。但由于描述能力限制,展现复杂格式存在不完全兼容的情况。HTML5兼容性好,通过嵌入字库子集,在移动端缺少字库的情况下,也能准确展现出各种字体效果。九云图DocSDK系统运行需求是4核32G,最大支持500M文档,每秒钟能处理5~10页内容。采用多线程技术,可同时处理20个文档,超过20个时自动排队。对于高并发场景,可部署集群,集群方案采用MongoDB做中间件,支持负载均衡。
-
九云图DocSDK智能文档格式转换系统(九云图DocSDK Server,www.docsdk.com ),是一个服务器软件,提供了开发接口(API),能够解决各类文档格式转换问题。用户通过部署该产品,可以在软件产品中,快速实现涉及文档格式转换的相关功能,提高研发效率。下面是一个“通用文档全文检索系统”产品技术方案架构示意图: 该方案部署了九云图DocSDK Server,用来支持非结构化文档。主要作用如下:1. 格式解析。对所支持的Office/WPS/ODF/CAD/PDF等各类文档进行格式解析,将文档的非结构化信息解析成结构化的 JSON 格式,用于建立索引;2. 版面重建。一些绝对定位的文档中,缺少准确的段落描述,比如有的文档的豆腐块版式,文本PDF,文字是以零散方式描述的位置信息。这种方式预览阅读时没有问题,视觉效果上具有段落区分。但程序在进行全文检索时,就会出现错漏情况。九云图DocSDK通过智能算法,根据文字位置、字体、内容的相关信息,准确划分段落,实现版面重建;3. 表格识别。表格里的信息天然具备结构化特征,很多情况检索时需要利用这类特征。但有些文档表面看起来是表格,实际并没有行列关系的描述,这时就需要通过表格识别算法,将行列关系还原出来;4. 在线展现。检索结果需要在线展现,九云图DocSDK对各类文档提供了三种在线展现形式,图片、传统HTML和HTML5。图片方式通用性好,但缩放时存在不清晰现象。传统HTML可以支持交互,能实现内容标注、编辑等需求。但由于描述能力限制,展现复杂格式存在不完全兼容的情况。HTML5兼容性好,通过嵌入字库子集,在移动端缺少字库的情况下,也能准确展现出各种字体效果。九云图DocSDK系统运行需求是4核32G,最大支持500M文档,每秒钟能处理5~10页内容。采用多线程技术,可同时处理20个文档,超过20个时自动排队。对于高并发场景,可部署集群,集群方案采用MongoDB做中间件,支持负载均衡。
-
九云图DocSDK智能文档格式转换系统(九云图DocSDK Server,www.docsdk.com ),是一个服务器软件,提供了开发接口(API),能够解决各类文档格式转换问题。用户通过部署该产品,可以在软件产品中,快速实现涉及文档格式转换的相关功能,提高研发效率。下面是一个“通用文档全文检索系统”产品技术方案架构示意图: 该方案部署了九云图DocSDK Server,用来支持非结构化文档。主要作用如下:1. 格式解析。对所支持的Office/WPS/ODF/CAD/PDF等各类文档进行格式解析,将文档的非结构化信息解析成结构化的 JSON 格式,用于建立索引;2. 版面重建。一些绝对定位的文档中,缺少准确的段落描述,比如有的文档的豆腐块版式,文本PDF,文字是以零散方式描述的位置信息。这种方式预览阅读时没有问题,视觉效果上具有段落区分。但程序在进行全文检索时,就会出现错漏情况。九云图DocSDK通过智能算法,根据文字位置、字体、内容的相关信息,准确划分段落,实现版面重建;3. 表格识别。表格里的信息天然具备结构化特征,很多情况检索时需要利用这类特征。但有些文档表面看起来是表格,实际并没有行列关系的描述,这时就需要通过表格识别算法,将行列关系还原出来;4. 在线展现。检索结果需要在线展现,九云图DocSDK对各类文档提供了三种在线展现形式,图片、传统HTML和HTML5。图片方式通用性好,但缩放时存在不清晰现象。传统HTML可以支持交互,能实现内容标注、编辑等需求。但由于描述能力限制,展现复杂格式存在不完全兼容的情况。HTML5兼容性好,通过嵌入字库子集,在移动端缺少字库的情况下,也能准确展现出各种字体效果。九云图DocSDK系统运行需求是4核32G,最大支持500M文档,每秒钟能处理5~10页内容。采用多线程技术,可同时处理20个文档,超过20个时自动排队。对于高并发场景,可部署集群,集群方案采用MongoDB做中间件,支持负载均衡。
-
九云图DocSDK智能文档格式转换系统(九云图DocSDK Server,www.docsdk.com ),是一个服务器软件,提供了开发接口(API),能够解决各类文档格式转换问题。用户通过部署该产品,可以在软件产品中,快速实现涉及文档格式转换的相关功能,提高研发效率。下面是一个“通用文档全文检索系统”产品技术方案架构示意图: 该方案部署了九云图DocSDK Server,用来支持非结构化文档。主要作用如下:1. 格式解析。对所支持的Office/WPS/ODF/CAD/PDF等各类文档进行格式解析,将文档的非结构化信息解析成结构化的 JSON 格式,用于建立索引;2. 版面重建。一些绝对定位的文档中,缺少准确的段落描述,比如有的文档的豆腐块版式,文本PDF,文字是以零散方式描述的位置信息。这种方式预览阅读时没有问题,视觉效果上具有段落区分。但程序在进行全文检索时,就会出现错漏情况。九云图DocSDK通过智能算法,根据文字位置、字体、内容的相关信息,准确划分段落,实现版面重建;3. 表格识别。表格里的信息天然具备结构化特征,很多情况检索时需要利用这类特征。但有些文档表面看起来是表格,实际并没有行列关系的描述,这时就需要通过表格识别算法,将行列关系还原出来;4. 在线展现。检索结果需要在线展现,九云图DocSDK对各类文档提供了三种在线展现形式,图片、传统HTML和HTML5。图片方式通用性好,但缩放时存在不清晰现象。传统HTML可以支持交互,能实现内容标注、编辑等需求。但由于描述能力限制,展现复杂格式存在不完全兼容的情况。HTML5兼容性好,通过嵌入字库子集,在移动端缺少字库的情况下,也能准确展现出各种字体效果。九云图DocSDK系统运行需求是4核32G,最大支持500M文档,每秒钟能处理5~10页内容。采用多线程技术,可同时处理20个文档,超过20个时自动排队。对于高并发场景,可部署集群,集群方案采用MongoDB做中间件,支持负载均衡。
-
九云图DocSDK智能文档格式转换系统(九云图DocSDK Server,www.docsdk.com ),是一个服务器软件,提供了开发接口(API),能够解决各类文档格式转换问题。用户通过部署该产品,可以在软件产品中,快速实现涉及文档格式转换的相关功能,提高研发效率。下面是一个“通用文档全文检索系统”产品技术方案架构示意图: 该方案部署了九云图DocSDK Server,用来支持非结构化文档。主要作用如下:1. 格式解析。对所支持的Office/WPS/ODF/CAD/PDF等各类文档进行格式解析,将文档的非结构化信息解析成结构化的 JSON 格式,用于建立索引;2. 版面重建。一些绝对定位的文档中,缺少准确的段落描述,比如有的文档的豆腐块版式,文本行内容交错,有的PDF文字是以零散方式描述的位置信息。这些情况预览阅读时没有问题,视觉效果上具有段落区分。但程序在进行全文检索时,就会出现错漏情况。九云图DocSDK通过智能算法,根据文字位置、字体、内容的相关信息,准确划分段落,实现版面重建;3. 表格识别。表格里的信息天然具备结构化特征,很多情况检索时需要利用这类特征。但有些文档表面看起来是表格,实际并没有行列关系的描述,这时就需要通过表格识别算法,将行列关系还原出来;4. 在线展现。检索结果需要在线展现,九云图DocSDK对各类文档提供了三种在线展现形式,图片、传统HTML和HTML5。图片方式通用性好,但缩放时存在不清晰现象。传统HTML可以支持交互,能实现内容标注、编辑等需求。但由于描述能力限制,展现复杂格式存在不完全兼容的情况。HTML5兼容性好,通过嵌入字库子集,在移动端缺少字库的情况下,也能准确展现出各种字体效果。九云图DocSDK系统运行需求是4核32G,最大支持500M文档,每秒钟能处理5~10页内容。采用多线程技术,可同时处理20个文档,超过20个时自动排队。对于高并发场景,可部署集群,集群方案采用MongoDB做中间件,支持负载均衡。
-
鲲鹏认证的九云图DocSDK智能文档格式转换系统(九云图DocSDK Server,www.docsdk.com ),是一个服务器软件,提供了开发接口(API),能够解决各类文档格式转换问题。用户通过部署该产品,可以在软件产品中,快速实现涉及文档格式转换的相关功能,提高研发效率。下面是一个“通用文档全文检索系统”产品技术方案架构示意图: 该方案部署了九云图DocSDK Server,用来支持非结构化文档。主要作用如下:1. 格式解析。对所支持的Office/WPS/ODF/CAD/PDF等各类文档进行格式解析,将文档的非结构化信息解析成结构化的 JSON 格式,用于建立索引;2. 版面重建。一些绝对定位的文档中,缺少准确的段落描述,比如有的文档的豆腐块版式,文本PDF,文字是以零散方式描述的位置信息。这种方式预览阅读时没有问题,视觉效果上具有段落区分。但程序在进行全文检索时,就会出现错漏情况。九云图DocSDK通过智能算法,根据文字位置、字体、内容的相关信息,准确划分段落,实现版面重建;3. 表格识别。表格里的信息天然具备结构化特征,很多情况检索时需要利用这类特征。但有些文档表面看起来是表格,实际并没有行列关系的描述,这时就需要通过表格识别算法,将行列关系还原出来;4. 在线展现。检索结果需要在线展现,九云图DocSDK对各类文档提供了三种在线展现形式,图片、传统HTML和HTML5。图片方式通用性好,但缩放时存在不清晰现象。传统HTML可以支持交互,能实现内容标注、编辑等需求。但由于描述能力限制,展现复杂格式存在不完全兼容的情况。HTML5兼容性好,通过嵌入字库子集,在移动端缺少字库的情况下,也能准确展现出各种字体效果。九云图DocSDK系统运行需求是4核32G,最大支持500M文档,每秒钟能处理5~10页内容。采用多线程技术,可同时处理20个文档,超过20个时自动排队。对于高并发场景,可部署集群,集群方案采用MongoDB做中间件,支持负载均衡。
-
九云图DocSDK智能文档格式转换系统(九云图DocSDK Server,www.docsdk.com ),是一个服务器软件,提供了开发接口(API),能够解决各类文档格式转换问题。用户通过部署该产品,可以在软件产品中,快速实现涉及文档格式转换的相关功能,提高研发效率。下面是一个“通用文档全文检索系统”产品技术方案架构示意图: 该方案部署了九云图DocSDK Server,用来支持非结构化文档。主要作用如下:1. 格式解析。对所支持的Office/WPS/ODF/CAD/PDF等各类文档进行格式解析,将文档的非结构化信息解析成结构化的 JSON 格式,用于建立索引;2. 版面重建。一些绝对定位的文档中,缺少准确的段落描述,比如有的文档的豆腐块版式,文本PDF,文字是以零散方式描述的位置信息。这种方式预览阅读时没有问题,视觉效果上具有段落区分。但程序在进行全文检索时,就会出现错漏情况。九云图DocSDK通过智能算法,根据文字位置、字体、内容的相关信息,准确划分段落,实现版面重建;3. 表格识别。表格里的信息天然具备结构化特征,很多情况检索时需要利用这类特征。但有些文档表面看起来是表格,实际并没有行列关系的描述,这时就需要通过表格识别算法,将行列关系还原出来;4. 在线展现。检索结果需要在线展现,九云图DocSDK对各类文档提供了三种在线展现形式,图片、传统HTML和HTML5。图片方式通用性好,但缩放时存在不清晰现象。传统HTML可以支持交互,能实现内容标注、编辑等需求。但由于描述能力限制,展现复杂格式存在不完全兼容的情况。HTML5兼容性好,通过嵌入字库子集,在移动端缺少字库的情况下,也能准确展现出各种字体效果。九云图DocSDK系统运行需求是4核32G,最大支持500M文档,每秒钟能处理5~10页内容。采用多线程技术,可同时处理20个文档,超过20个时自动排队。对于高并发场景,可部署集群,集群方案采用MongoDB做中间件,支持负载均衡。
-
九云图DocSDK智能文档格式转换系统(九云图DocSDK Server,www.docsdk.com ),是一个服务器软件,提供了开发接口(API),能够解决各类文档格式转换问题。用户通过部署该产品,可以在软件产品中,快速实现涉及文档格式转换的相关功能,提高研发效率。下面是一个“通用文档全文检索系统”产品技术方案架构示意图: 该方案部署了九云图DocSDK Server,用来支持非结构化文档。主要作用如下:1. 格式解析。对所支持的Office/WPS/ODF/CAD/PDF等各类文档进行格式解析,将文档的非结构化信息解析成结构化的JSON格式,用于建立索引;2. 版面重建。一些绝对定位的文档中,缺少准确的段落描述,比如有的PDF,文字是以零散方式描述的位置信息。这种方式预览阅读时没有问题,视觉效果上具有段落区分。但程序在进行全文检索时,就会出现错漏情况。九云图DocSDK通过智能算法,根据文字位置、字体、内容的相关信息,准确划分段落,实现版面重建;3. 表格识别。表格里的信息天然具备结构化特征,很多情况检索时需要利用这类特征。但有些文档表面看起来是表格,实际并没有行列关系的描述,这时就需要通过表格识别算法,将行列关系还原出来;4. 在线展现。检索结果需要在线展现,九云图DocSDK对各类文档提供了三种在线展现形式,图片、传统HTML和HTML5。图片方式通用性好,但缩放时存在不清晰现象。传统HTML可以支持交互,能实现内容标注、编辑等需求。但由于描述能力限制,展现复杂格式存在不完全兼容的情况。HTML5兼容性好,通过嵌入字库子集,在移动端缺少字库的情况下,也能准确展现出各种字体效果。九云图DocSDK系统运行需求是4核32G,最大支持500M文档,每秒钟能处理5~10页内容。采用多线程技术,可同时处理20个文档,超过20个时自动排队。对于高并发场景,可部署集群,集群方案采用MongoDB做中间件,支持负载均衡。
-
DWS 中使用中文分词,但一些词组切分不合适,需要自定义词典,请指教如何处理?如:SELECT to_tsvector('zhparser', '地爽公司'); 被拆分为 :'公司':3 '地':1 '爽':2而希望被拆分为:'公司':2 '地爽':1
-
全文检索(Text search)顾名思义,就是在给定的文档中查找指定模式(pattern)的过程。GaussDB(DWS)支持对表格中文本类型的字段及字段的组合做全文检索,找出能匹配给定模式的文本,并以用户期望的方式将匹配结果呈现出来。本文结合笔者的经验和思考,对GaussDB(DWS)的全文检索功能作简要介绍,希望能对读者有所帮助。 1. 预处理 在指定的文档中查找一个模式有很多种办法,例如可以用grep命令搜索一个正则表达式。理论上,对数据库中的文本字段也可以用类似grep的方式来检索模式,GaussDB(DWS)中就可以通过关键字“LIKE”或操作符“~”来匹配字符串。但这样做有很多问题。首先对每段文本都要扫描,效率比较低,难以衡量“匹配度”或“相关度”。而且只能机械地匹配字符串,缺少对语法语义的分析能力,例如对英语中的名词复数,动词的时态变换等难以自动地识别和匹配,对于由自然语言构成的文本无法获得令人满意的检索结果。 GaussDB(DWS)采用类似搜索引擎的方式来进行全文检索。首先对给定的文本和模式做预处理,包括从一段文本中提取出单词或词组,去掉对检索无用的停用词(stop word),对变形后的单词做标准化等等,使之变为适合检索的形式再作匹配。 GaussDB(DWS)中,原始的文档和搜索条件都用文本(text)表示,或者说,用字符串表示。经过预处理后的文档变为tsvector类型,通过函数to_tsvector来实现这一转换。例如,postgres=# select to_tsvector('a fat cat ate fat rats'); to_tsvector ----------------------------------- 'ate':4 'cat':3 'fat':2,5 'rat':6(1 row) 观察上面输出的tsvector类型,可以看到to_tsvector的效果:首先各个单词被摘取出来,其位置用整数标识出来,例如“fat”位于原始句子中的第2和第5个词的位置。此外,“a”这个词太常见了,几乎每个文档里都会出现,对于检索到有用的信息几乎没有帮助。套用香农理论,一个词出现的概率越大,其包含的信息量越小。像“a”,“the”这种单词几乎不携带任何信息,所以被当做停用词(stop word)去掉了。注意这并没有影响其他词的位置编号,“fat”的位置仍然是2和5,而不是1和4。另外,复数形式的“rats”被换成了单数形式“rat”。这个操作被称为标准化(Normalize),主要是针对西文中单词在不同语境中会发生的变形,去掉后缀保留词根的一种操作。其意义在于简化自然语言的检索,例如检索“rat”时可以将包含“rat”和“rats”的文档都检索出来。被标准化后得到的单词称为词位(lexeme),比如“rat”。而原始的单词被称为语言符号(token)。 将一个文档转换成tsvector形式有很多好处。例如,可以方便地创建索引,提高检索的速度和效率,当文档数量巨大时,通过索引来检索关键字比grep这种全文扫描匹配要快得多。再比如,可以对不同关键字按重要程度分配不同的权重,方便对检索结果进行排序,找出相关度最高的文档等等。 经过预处理后的检索条件被转换成tsquery类型,可通过to_tsquery函数实现。例如,postgres=# select to_tsquery('a & cats & rat'); to_tsquery --------------- 'cat' & 'rat'(1 row) 从上面的例子可以看到:跟to_tsvector类似,to_tsquery也会对输入文本做去掉停用词、标准化等操作,例如去掉了“a”,把“cats”变成“cat”等。输入的检索条件本身必须用与(&)、或(|)、非(!)操作符连接,例如下面的语句会报错postgres=# select to_tsquery('cats rat');ERROR: syntax error in tsquery: "cats rat"CONTEXT: referenced column: to_tsquery 但plainto_tsquery没有这个限制。plainto_tsquery会把输入的单词变成“与”条件:postgres=# select plainto_tsquery('cats rat'); plainto_tsquery----------------- 'cat' & 'rat'(1 row)postgres=# select plainto_tsquery('cats,rat'); plainto_tsquery----------------- 'cat' & 'rat'(1 row) 除了用函数之外,还可以用强制类型转换的方式将一个字符串转换成tsvector或tsquery类型,例如postgres=# select 'fat cats sat on a mat and ate a fat rat'::tsvector; tsvector ----------------------------------------------------- 'a' 'and' 'ate' 'cats' 'fat' 'mat' 'on' 'rat' 'sat'(1 row)postgres=# select 'a & fat & rats'::tsquery; tsquery ---------------------- 'a' & 'fat' & 'rats'(1 row) 跟函数的区别是强制类型转换不会去掉停用词,也不会作标准化,且对于tsvector类型不会记录词的位置。 2. 模式匹配 把输入文档和检索条件转换成tsvector和tsquery之后,就可以进行模式匹配了。GaussDB(DWS)中使用“@@”操作符来进行模式匹配,成功返回True,失败返回false。 例如创建如下表格,postgres=# create table post(postgres(# id bigint,postgres(# author name,postgres(# title text,postgres(# body text);CREATE TABLE-- insert some tuples 然后想检索body中含有“physics”或“math”的帖子标题,可以用如下的语句来查询:postgres=# select title from post where to_tsvector(body) @@ to_tsquery('physics | math'); title ----------------------------- The most popular math books 也可以将多个字段组合起来查询:postgres=# select title from post where to_tsvector(title || ' ' || body) @@ to_tsquery('physics | math'); title ----------------------------- The most popular math books(1 row) 注意不同的查询方式可能产生不同的结果。例如下面的匹配不成功,因为::tsquery没对检索条件做标准化,前面的tsvector里找不到“cats”这个词:postgres=# select to_tsvector('a fat cat ate fat rats') @@ 'cats & rat'::tsquery; ?column?---------- f(1 row) 而同样的文档和检索条件,下面的匹配能成功,因为to_tsquery会把“cats”变成“cat”:postgres=# select to_tsvector('a fat cat ate fat rats') @@ to_tsquery('cats & rat'); ?column?---------- t(1 row) 类似地,下面的匹配不成功,因为to_tsvector会把停用词a去掉:postgres=# select to_tsvector('a fat cat ate fat rats') @@ 'cat & rat & a'::tsquery; ?column?---------- f(1 row) 而下面的能成功,因为::tsvector保留了所有词:postgres=# select 'a fat cat ate fat rats'::tsvector @@ 'cat & rat & a'::tsquery; ?column?---------- f(1 row) 所以应根据需要选择合适的检索方式。 此外,@@操作符可以对输入的text做隐式类型转换,例如,postgres=# select title from post where body @@ 'physics | math'; title-------(0 rows) 准确来讲,text@@text相当于to_tsvector(text) @@ plainto_tsquery(text),因此上面的匹配不成功,因为plainto_tsquery会把或条件'physics | math'变成与条件'physic' & 'math'。使用时要格外小心。 3. 创建和使用索引 前文提到,逐个扫描表中的文本字段缓慢低效,而索引查找能够提高检索的速度和效率。GaussDB(DWS)支持用通用倒排索引GIN(Generalized Inverted Index)进行全文检索。GIN是搜索引擎中常用的一种索引,其主要原理是通过关键字反过来查找所在的文档,从而提高查询效率。可通过以下语句在text类型的字段上创建GIN索引:postgres=# create index post_body_idx_1 on post using gin(to_tsvector('english', body));CREATE INDEX 注意这里必须使用to_tsvector函数生成tsvector,不能使用强制或隐式类型转换。而且这里用到的to_tsvector函数比前一节多了一个参数’english’,这个参数是用来指定文本搜索配置(Text search Configuration)的。关于文本搜索配置将在下一节介绍。不同的配置计算出来的tsvector不同,生成的索引自然也不同,所以这里必须明确指定,而且在查询的时候只有配置和字段都与索引定义一致才能通过索引查找。例如下面的查询中,前一个可以通过post_body_idx_1来检索,后一个找不到对应的索引,只能通过全表扫描检索。postgres=# explain select title from post where to_tsvector('english', body) @@ to_tsquery('physics | math'); QUERY PLAN ----------------------------------------------------------------------------------------------------- id | operation | E-rows | E-width | E-costs ----+---------------------------------+--------+---------+--------- 1 | -> Streaming (type: GATHER) | 1 | 32 | 42.02 2 | -> Bitmap Heap Scan on post | 1 | 32 | 16.02 3 | -> Bitmap Index Scan | 1 | 0 | 12.00 postgres=# explain select title from post where to_tsvector('french', body) @@ to_tsquery('physics | math'); QUERY PLAN ---------------------------------------------------------------------------------------------- id | operation | E-rows | E-width | E-costs ----+------------------------------+--------+---------+------------------ 1 | -> Streaming (type: GATHER) | 1 | 32 | 1000000002360.50 2 | -> Seq Scan on post | 1 | 32 | 1000000002334.50 4. 全文检索配置(Text search Configuration) 这一节谈谈GaussDB(DWS)如何对文档做预处理,或者说,to_tsvector是如何工作的。 文档预处理大体上分如下三步进行:第一步,将文本中的单词或词组一个一个提取出来。这项工作由解析器(Parser)或称分词(Segmentation)器来进行。完成后文档变成一系列token。第二步,对上一步得到的token做标准化,包括依据指定的规则去掉前后缀,转换同义词,去掉停用词等等,从而得到一个个词位(lexeme)。这一步操作依据词典(Dictionary)来进行,也就是说,词典定义了标准化的规则。最后,记录各个词位的位置(和权重),从而得到tsvector。 从上面的描述可以看出,如果给定了解析器和词典,那么文档预处理的规则也就确定了。在GaussDB(DWS)中,这一整套文档预处理的规则称为全文检索配置(Text search Configuration)。全文检索配置决定了匹配的结果和质量。 如下图所示,一个全文检索配置由一个解析器和一组词典组成。输入文档首先被解析器分解成token,然后对每个token逐个词典查找,如果在某个词典中找到这个token,就按照该词典的规则对其做Normalize。有的词典做完Normalize后会将该token标记为“已处理”,这样后面的字典就不会再处理了。有的词典做完Normalize后将其输出为新的token交给后面的词典处理,这样的词典称为“过滤型”词典。 图1 文档预处理过程 配置使用的解析器在创建配置的时候指定,且不可修改,例如,postgres=# create text search configuration mytsconf (parser = default);CREATE TEXT SEARCH CONFIGURATION GaussDB(DWS)内置了4种解析器,目前不支持自定义解析器。postgres=# select prsname from pg_ts_parser; prsname ---------- default ngram pound zhparser(4 rows) 词典则通过ALTER TEXT SEARCH CONFIGURATION命令来指定,例如postgres=# alter text search configuration mytsconf add mapping for asciiword with english_stem,simple;ALTER TEXT SEARCH CONFIGURATION指定了mytsconf使用english_stem和simple这两种词典来对“asciiword”类型的token做标准化。 上面语句中的“asciiword”是一种token类型。解析器会对分解出的token做分类,不同的解析器分类方式不同,可通过ts_token_type函数查看。例如,‘default’解析器将token分为如下23种类型:postgres=# select * from ts_token_type('default'); tokid | alias | description -------+-----------------+------------------------------------------ 1 | asciiword | Word, all ASCII 2 | word | Word, all letters 3 | numword | Word, letters and digits 4 | email | Email address 5 | url | URL 6 | host | Host 7 | sfloat | Scientific notation 8 | version | Version number 9 | hword_numpart | Hyphenated word part, letters and digits 10 | hword_part | Hyphenated word part, all letters 11 | hword_asciipart | Hyphenated word part, all ASCII 12 | blank | Space symbols 13 | tag | XML tag 14 | protocol | Protocol head 15 | numhword | Hyphenated word, letters and digits 16 | asciihword | Hyphenated word, all ASCII 17 | hword | Hyphenated word, all letters 18 | url_path | URL path 19 | file | File or path name 20 | float | Decimal notation 21 | int | Signed integer 22 | uint | Unsigned integer 23 | entity | XML entity(23 rows) 当前数据库中已有的词典可以通过系统表pg_ts_dict查询。 如果指定了配置,系统会按照指定的配置对文档作预处理,如上一节创建GIN索引的命令。如果没指定配置,to_tsvector使用default_text_search_config变量指定的默认配置。postgres=# show default_text_search_config; -- 查看当前默认配置 default_text_search_config---------------------------- pg_catalog.english(1 row)postgres=# set default_text_search_config = mytsconf; -- 设置默认配置SETpostgres=# show default_text_search_config; default_text_search_config---------------------------- public.mytsconf(1 row)postgres=# reset default_text_search_config; -- 恢复默认配置RESETpostgres=# show default_text_search_config; default_text_search_config---------------------------- pg_catalog.english(1 row) 注意default_text_search_config是一个session级的变量,只在当前会话中有效。如果想让默认配置持久生效,可以修改postgresql.conf配置文件中的同名变量,如下图所示。修改后需要重启进程。总结 GaussDB(DWS)的全文检索模块提供了强大的文档搜索功能。相比于用“LIKE”关键字,或 “~”操作符的模式匹配,全文检索提供了较丰富的语义语法支持,能对自然语言文本做更加智能化的处理。配合恰当的索引,能够实现对文档的高效检索。 本文简要介绍了GaussDB(DWS)全文检索的原理和使用方法,关于解析器和词典的更详细的介绍,请看另一篇文章《GaussDB(DWS)全文检索之解析器和词典》(待完成)。
-
【摘要】 GaussDB(DWS)全文检索特性概述,以及功能简介。全文检索是在互联网场景下应用非常广泛的特性,搜索引擎、站内搜索、电商搜索等场景下都会使用到,GaussDB(DWS)同样也支持全文检索功能,是基于GIN索引实现的,下面给大家详细介绍一下GaussDB(DWS)的全文检索特性的功能。全文检索实现的功能,简单来说就是根据关键字从在全文字段中搜索到相关的信息,在不使用全文检索特性时,只能通过like ‘%keyword%’方式做模糊匹配,无法利用到索引,只能进行全表扫描,效率非常低,全文检索特性可以有效地提升检索性能。全文检索的基础就是GIN索引,Generalized Inverted Index,也就是通用倒排索引,是一个存储对(key, posting list)集合的索引结构,其中key是一个键值,而posting list 是一组出现过key的位置。如(‘hello', 2,3)中,表示hello在2和3这两个位置出现过。先来了解一下几个接口to_tsvectorto_tsvector(text, text)这个函数可以把一个文本转换为一个向量,其中保存单词和其出现的顺序,test=# SELECT to_tsvector('english', 'huawei cloud data warehouse'); to_tsvector -------------------------------------------- 'cloud':2 'data':3 'huawei':1 'warehous':4(1 row)test=# SELECT to_tsvector('zhparser', '华为云数据仓库'); to_tsvector ----------------------------------- '云':2 '仓库':4 '华为':1 '数据':3(1 row)to_tsqueryto_tsquery(text)这个函数作用是用来把文本转化为可查询的语句,例如:SELECT to_tsquery('华为&深圳');这样就是寻找文本既包含“华为”,也包含“深圳”的语句,&是AND与操作,|是OR或操作如果想知道一个tsvector是否让tsquery成立,可以使用 @@ 操作符,例如:SELECT to_tsvector('zhparser', '华为深圳') @@ to_tsquery('华为&深圳');这条语句会返回Truets_rankts_rank(tsvector, tsquery)这个函数可以计算tsvector和tsquery的近似程度,通过这个函数计算出rank之后,就可以排序了SELECTts_rank( to_tsvector('zhparser', '华为深圳'), to_tsquery('华为&深圳')); 讲完了这些接口,让我们来做一些具体实践:1.创建数据库CREATE DATABASE test ENCODING 'utf8' template = template0;【注意】全文检索必须使用在encoding为utf8或者gbk的数据库上。2.创建表CREATE TABLE t1(id int, news text, location text);3.导入数据INSERT INTO t1 VALUES(1, '华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品', '北京');INSERT INTO t1 VALUES(2, 'GaussDB(DWS)历经十年磨炼,是业界领先的企业级云分布式数据仓库服务', '深圳');INSERT INTO t1 VALUES(3, '华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践', '深圳');INSERT INTO t1 VALUES(4, '数智金融 使能创新,2020 华为 数智金融论坛在溪村成功举办', '东莞');INSERT INTO t1 VALUES(5, '华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕', '西安');4.创建索引CREATE INDEX t1_news_idx ON t1 USING gin(to_tsvector('zhparser', news));执行查询:SELECT * FROM t1 WHERE to_tsvector('zhparser',news) @@ to_tsquery('华为');查询结果: id | news | location ----+----------------------------------------------------------------------------------------------------------------------------------------------+---------- 5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕 | 西安 1 | 华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品 | 北京 3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳 4 | 数智金融 使能创新,2020 华为 数智金融论坛在溪村成功举办 | 东莞(4 rows)news中只要包含“华为”词组,都会检索出来5.创建多字段联合索引:CREATE INDEX t1_news_location_idx ON t1 USING gin(to_tsvector('zhparser', news||location)); 执行结果:查找同时包含两个词组SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('华为 & 深圳');news跟location只要有一个字段中包含“华为”和“深圳”都会检索出来test=# SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('华为 & 深圳'); id | news | location ----+----------------------------------------------------------------------------------------------------------------------------------------------+---------- 3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳(1 row)查询包含其中一个词组SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('云|深圳');news跟location只要有一个包含“云”跟“深圳”这两个词的任何一个都会检索出来。test=# SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('云|深圳'); id | news | location ----+----------------------------------------------------------------------------------------------------------------------------------------------+---------- 5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕 | 西安 3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳 1 | 华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品 | 北京 2 | GaussDB(DWS)历经十年磨炼,是业界领先的企业级云分布式数据仓库服务 | 深圳(4 rows)6.排序按照某一列包含的某个词组权重来排序SELECT id, news, location ,ts_rank_cd(to_tsvector('zhparser',news), query) AS rank FROM t1, to_tsquery('华为') query WHERE query @@ to_tsvector('zhparser',news) order by rank DESC;执行结果:test=# SELECT id, news, location ,ts_rank_cd(to_tsvector('zhparser',news), query) AS rank FROM t1, to_tsquery('华为') query WHERE query @@ to_tsvector('zhparser',news) order by rank DESC; id | news | location | rank ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+------ 3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳 | .3 1 | 华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品 | 北京 | .2 4 | 数智金融 使能创新,2020 华为 数智金融论坛在溪村成功举办 | 东莞 | .1 5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕 | 西安 | .1(4 rows)搜索出含有“华为”的词组,并且根据权重排序 按照某一列包含多个词组权重排序(同时包含两个词组)SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('华为&深圳') query WHERE query @@ to_tsvector('zhparser',news||location) order by rank DESC;执行结果:test=# SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('华为&深圳') query WHERE query @@ to_tsvector('zhparser',news||location) order by rank DESC; id | news | location | rank ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+----------- 3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳 | .00555556(1 row)搜索出含有“华为”和“深圳”的词组,并且根据权重排序 按照某一列包含多个词组权重排序(包含两个词组其中一个)SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('云|深圳') query WHERE query @@ to_tsvector('zhparser', news||location) order by rank DESC;查看执行结果:test=# SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('云|深圳') query WHERE query @@ to_tsvector('zhparser', news||location) order by rank DESC; id | news | location | rank ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+------ 1 | 华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品 | 北京 | .2 2 | GaussDB(DWS)历经十年磨炼,是业界领先的企业级云分布式数据仓库服务 | 深圳 | .2 5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕 | 西安 | .1 3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳 | .1(4 rows)检索出包含“云”或者“深圳”的记录,并且根据权重排序。通过以上的案例,相信大家对GaussDB(DWS)的全文检索使用已经有了一些了解,其实全文检索还有ngram分词,和自定义词典等等其他用法,大家如果有兴趣,可以访问DWS产品文档或者在本社区提问,获取更全面的解答。原文链接:https://bbs.huaweicloud.com/blogs/231250【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
一、前言隔壁小王问我,如何使用 Mysql 实现类似于 ElasticSearch 的全文检索功能,并且对检索关键词跑分?我当时脑子里立马产生了疑问?为啥不直接用es呢?简单好用还贼快。但是听他说,数据量不多,客户给的时间非常有限,根本没时间去搭建es,所以还是看一下 Mysql 的全文检索功能吧!MySQL 从 5.7.6 版本开始,MySQL就内置了ngram全文解析器,用来支持中文、日文、韩文分词。在 MySQL 5.7.6 版本之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。本篇文章测试的时候,采用的 Mysql 5.7.6 ,InnoDB数据库引擎。mysql全文检索二、全文解析器ngramngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“你好世界”进行分词:n=1: '你', '好', '世', '界' n=2: '你好', '好世', '世界' n=3: '你好世', '好世界' n=4: '你好世界'MySQL 中使用全局变量 ngram_token_size 来配置 ngram 中 n 的大小,它的取值范围是1到10,默认值是 2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为 1。在默认值是 2 的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值 2。咱们看一下Mysql默认的ngram_token_size大小show variables like 'ngram_token_size'ngram_token_size 变量的两种设置方式:1、启动mysqld命令时指定mysqld --ngram_token_size=22、修改mysql配置文件[mysqld] ngram_token_size=2三、全文索引以某文书数据为例,新建数据表 t_wenshu ,并且针对文书内容字段创建全文索引,导入10w条测试数据。1、建表时创建全文索引CREATE TABLE `t_wenshu` ( `province` varchar(255) DEFAULT NULL, `caseclass` varchar(255) DEFAULT NULL, `casenumber` varchar(255) DEFAULT NULL, `caseid` varchar(255) DEFAULT NULL, `types` varchar(255) DEFAULT NULL, `title` varchar(255) DEFAULT NULL, `content` longtext, `updatetime` varchar(255) DEFAULT NULL, FULLTEXT KEY `content` (`content`) WITH PARSER `ngram` ) ENGINE=InnoDB DEFAULT CHARSET=utf8;2、通过 alter table 方式ALTER TABLE t_wenshu ADD FULLTEXT INDEX content_index (content) WITH PARSER ngram;3、通过 create index 方式CREATE FULLTEXT INDEX content_index ON t_wenshu (content) WITH PARSER ngram;四、检索模式自然语言检索(IN NATURAL LANGUAGE MODE)自然语言模式是 MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。布尔检索(IN BOOLEAN MODE)剔除一半匹配行以上都有的词,例如,每行都有this这个词的话,那用this去查时,会找不到任何结果,这在记录条数特别多时很有用,原因是数据库认为把所有行都找出来是没有意义的,这时,this几乎被当作是stopword(中断词);布尔检索模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。● IN BOOLEAN MODE的特色: ·不剔除50%以上符合的row。 ·不自动以相关性反向排序。 ·可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。 ·限制最长与最短的字符串。 ·套用Stopwords。 ● 搜索语法规则: + 一定要有(不含有该关键词的数据条均被忽略)。 - 不可以有(排除指定关键词,含有该关键词的均被忽略)。 > 提高该条匹配数据的权重值。 < 降低该条匹配数据的权重值。 ~ 将其相关性由正转负,表示拥有该字会降低相关性(但不像-将之排除),只是排在较后面权重值降低。 * 万用字,不像其他语法放在前面,这个要接在字符串后面。 " " 用双引号将一段句子包起来表示要完全相符,不可拆字。 查询扩展检索注释:(WITH QUERY EXPANSION)由于查询扩展可能带来许多非相关性的查询,谨慎使用!五、检索查询1)查询 content 中包含“盗窃罪”的记录,查询语句如下select caseid,content, MATCH ( content) AGAINST ('盗窃罪') as score from t_wenshu where MATCH ( content) AGAINST ('盗窃罪' IN NATURAL LANGUAGE MODE)2)查询 content 中包含“寻衅滋事”的记录,查询语句如下select caseid,content, MATCH ( content) AGAINST ('寻衅滋事') as score from t_wenshu where MATCH ( content) AGAINST ('寻衅滋事' IN NATURAL LANGUAGE MODE) ;3)单个汉字,查询 content 中包含“我”的记录,查询语句如下 select caseid,content, MATCH ( content) AGAINST ('我') as score from t_wenshu where MATCH ( content) AGAINST ('我' IN NATURAL LANGUAGE MODE) ;4)查询字段 content 中包含 “危险驾驶”和“寻衅滋事”的语句如下:select caseid,content, MATCH (content) AGAINST ('+危险驾驶 +寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('+危险驾驶 +寻衅滋事' IN BOOLEAN MODE); 5)查询字段 content 中包含 “危险驾驶”,但不包含“寻衅滋事”的语句如下:select caseid,content, MATCH (content) AGAINST ('+危险驾驶 -寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('+危险驾驶 -寻衅滋事' IN BOOLEAN MODE);6)查询字段 conent 中包含“危险驾驶”或者“寻衅滋事”的语句如下:select caseid,content, MATCH (content) AGAINST ('危险驾驶 寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('危险驾驶 寻衅滋事' IN BOOLEAN MODE);六、总结1)使用 Mysql 全文索引之前,搞清楚各版本支持情况;2)全文索引比 like + % 快 N 倍,但是可能存在精度问题;3)如果需要全文索引的是大量数据,建议先添加数据,再创建索引;4)对于中文,可以使用 MySQL 5.7.6 之后的版本,或者 Sphinx、Lucene 等第三方的插件;5)MATCH()函数使用的字段名,必须要与创建全文索引时指定的字段名一致,且只能是同一个表的字段不能跨表;
推荐直播
-
华为云AI入门课:AI发展趋势与华为愿景
2024/11/18 周一 18:20-20:20
Alex 华为云学堂技术讲师
本期直播旨在帮助开发者熟悉理解AI技术概念,AI发展趋势,AI实用化前景,了解熟悉未来主要技术栈,当前发展瓶颈等行业化知识。帮助开发者在AI领域快速构建知识体系,构建职业竞争力。
去报名 -
华为云软件开发生产线(CodeArts)10月新特性解读
2024/11/19 周二 19:00-20:00
苏柏亚培 华为云高级产品经理
不知道产品的最新特性?没法和产品团队建立直接的沟通?本期直播产品经理将为您解读华为云软件开发生产线10月发布的新特性,并在直播过程中为您答疑解惑。
去报名
热门标签