博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.11. 文本搜索类型
阅读量:5897 次
发布时间:2019-06-19

本文共 3161 字,大约阅读时间需要 10 分钟。

8.11. 文本搜索类型

PostgreSQL提供两种数据类型,它们被设计用来支持全文搜索,全文搜索是一种在自然语言的文档集合中搜索以定位那些最匹配一个查询的文档的活动。tsvector类型表示一个为文本搜索优化的形式下的文档,tsquery类型表示一个文本查询。提供了对于这种功能的详细解释,并且总结了相关的函数和操作符。

8.11.1. tsvector

一个tsvector值是一个排序的可区分词位的列表,词位是被正规化合并了同一个词的不同变种的词(详见)。排序和去重是在输入期间自动完成的,如下例所示:

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;                      tsvector---------------------------------------------------- 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'

要表示包含空白或标点的词位,将它们用引号包围:

SELECT $$the lexeme '    ' contains spaces$$::tsvector;                 tsvector------------------------------------------- '    ' 'contains' 'lexeme' 'spaces' 'the'

(我们在这个例子中使用美元符号包围的串文字并且下一个用来避免在文字中包含双引号记号产生的混淆)。嵌入的引号和反斜线必须被双写:

SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;                    tsvector------------------------------------------------ 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'

可选的,整数位置可以被附加给词位:

SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;                                  tsvector------------------------------------------------------------------------------- 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4

一个位置通常表示源词在文档中的定位。位置信息可以被用于邻近排名。位置值可以从 1 到 16383,更大的数字会被 16383。对于相同的词位出现的重复位置将被丢弃。

具有位置的词位可以进一步地被标注一个权重,它可以是A、 BCD。 D是默认值并且因此在输出中不会显示:

SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;          tsvector---------------------------- 'a':1A 'cat':5 'fat':2B,4C

权重通常被用来反映文档结构,例如将主题词标记成与正文词不同。文本搜索排名函数可以为不同的权重标记器分配不同的优先级。

了解tsvector类型本身并不执行任何词正规化这一点很重要,它假定给它的词已经被恰当地为应用正规化过。例如,

SELECT 'The Fat Rats'::tsvector;      tsvector-------------------- 'Fat' 'Rats' 'The'

对于大部分英语文本搜索应用,上面的词将会被认为是非正规化的,但是tsvector并不在乎这一点。原始文档文本通常应该经过to_tsvector以恰当地为搜索正规化其中的词:

SELECT to_tsvector('english', 'The Fat Rats');   to_tsvector----------------- 'fat':2 'rat':3

再次地,详情请参阅。

8.11.2. tsquery

一个tsquery值存储要用于搜索的词位,并且使用布尔操作符&(AND)、|(OR)和!(NOT)来组合它们,还有短语搜索操作符<->(FOLLOWED BY)。也有一种 FOLLOWED BY 操作符的变体<N>,其中N是一个整数常量,它指定要搜索的两个词位之间的距离。<->等效于<1>

圆括号可以被用来强制对操作符分组。如果没有圆括号,!(NOT)的优先级最高,其次是<->(FOLLOWED BY),然后是&(AND),最后是|(OR)。

这里有一些例子:

SELECT 'fat & rat'::tsquery;    tsquery--------------- 'fat' & 'rat'SELECT 'fat & (rat | cat)'::tsquery;          tsquery--------------------------- 'fat' & ( 'rat' | 'cat' )SELECT 'fat & rat & ! cat'::tsquery;        tsquery------------------------ 'fat' & 'rat' & !'cat'

可选地,一个tsquery中的词位可以被标注一个或多个权重字母,这将限制它们只能和具有那些权重之一的tsvector词位相匹配:

SELECT 'fat:ab & cat'::tsquery;    tsquery------------------ 'fat':AB & 'cat'

此外,一个tsquery中的词位可以被标注为*来指定前缀匹配:

SELECT 'super:*'::tsquery;  tsquery----------- 'super':*

这个查询将匹配一个tsvector中以super开头的任意词。

词位的引号规则和之前描述的tsvector中的词位相同;并且,正如tsvector,任何请求的词正规化必须在转换到tsquery类型之前完成。to_tsquery函数可以方便地执行这种正规化:

SELECT to_tsquery('Fat:ab & Cats');    to_tsquery------------------ 'fat':AB & 'cat'

注意to_tsquery将会以和其他词同样的方式处理前缀,这也意味着下面的比较会返回真:

SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ); ?column?---------- t

因为postgres会被处理成postgr

SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' );  to_tsvector  | to_tsquery---------------+------------ 'postgradu':1 | 'postgr':*

这会匹配postgraduate被处理后的形式。

本文转自PostgreSQL中文社区,原文链接:

转载地址:http://yxasx.baihongyu.com/

你可能感兴趣的文章
Vim和操作系统剪贴板交互
查看>>
使用ExposedObject对Asp.net MVC中匿名类型的JsonResult做单元测试
查看>>
ajax省市县联动
查看>>
Cox 教学视频5
查看>>
014-请问你觉得测试项目具体工作是什么?
查看>>
JVM类加载(4)—加载器
查看>>
public/private/protected的具体区别
查看>>
面试宝典——求一个字符串中连续出现次数最多的子串
查看>>
VMware Workstation虚拟机上网设置
查看>>
Jenkins持续集成学习-搭建jenkins问题汇总
查看>>
leetcode:Invert Binary Tree
查看>>
C#Note13:如何在C#中调用python
查看>>
Android介绍以及源码编译---Android源码下载
查看>>
SpringBoot集成redis缓存
查看>>
万恶的浏览器兼容问题
查看>>
sql经典语句
查看>>
使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)
查看>>
第4周作业-面向对象设计与继承
查看>>
mb_strcut与mb_substr()
查看>>
机器学习的原理
查看>>