• PostgreSQL全文检索
    • tsvector
    • tsquery

PostgreSQL全文检索

在日常的数据处理中,我们经常会有这样的需求:从一个文本中寻找某个字符串(比如某个单词)。

对这个需求,我们可以用类似这样的SQL完成:

SELECT * FROM student WHERE text LIKE ‘%pgsql%’;
(找到含有“pgsql”的文本)。

现在我们考虑一些特殊的情形:

  1. 需要查找的文本特别多,特别大;
  2. 不做单纯的字符串匹配,而是考虑自然语言的一些特性,比如匹配某一类字符串(域名、人名)或者匹配单词的所有形式
  3. 对中文的支持。

那么此时再用以上的 “SELECT … LIKE …” 就不明智了,因为对数据库来说,这样的SQL必然走的是全表扫描,那么当文本特别多、特别大的时候,查找效率就会很低。另外,这样的SQL也不会智能到可以处理自然语言的特性。

针对这一需要PostgreSQL提供了强大的全文搜索功能可以满足这样的需求。

PostgreSQL在8.3.x版本后开始支持全文检索。执行步骤,主要分三步走:

  1. 将文档分词 token,这些token可以是数字、单词、域名、人名、email的格式等等。在PG中可以定义一个parser(分析器)来做这个工作
  2. 转换分词规则如去掉复数后缀s/es,以及加入stop词,使之不会在分词 中出现
  3. 按一定顺序查询的优化方式存储 tsvector存储,使用tsquery查询

上述的这些操作都是对文本的预处理

tsvector

一个tsvector的值是唯一分词的分类列表,把一话一句词格式化为不同的词条,在进行分词处理的时候,tsvector会自动去掉分词中重复的词条,按照一定的顺序装入。例如:

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

从上面的例子可以看出 ,通过tsvector把一个字符串按照空格进行分词,分词的顺序是按照长短和字母来排序的。

并且词条位置常量可以附属于每个词条,例如:

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 'on':5 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4

这个位置信息通常就是当前文档中单词所处的位置,这个位置信息用于关注度的体现。位置信息常量的值的范围为1 到 16383。分词后,会把相同词条的位置记录到一个词条中。(如上所示)。

词条通过权重可以使其所在位置促进它的标记。权重分为A,B,C,D,D为默认值可以不显示.

权重用于关系,体现文档结构是很有特色地.例如,通俗一点,就是相同的词条,但是词条所在位置的权重不一样,在一个文档中,标题和文本内容,在做全文检索排序功能时需要分配给这两个词不同的优先权,不同的权重标记.

理解tsvector类型是很重要的,不能只关注标准的应用.例如

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

但是对于英文全文检索应用来说,上面的句子就是非标准化的,但是tsvector是不会知道的,为处理加工的文本应该通过使用to_tsvector函数来是之规格化,标注化的应用于搜索.

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

tsquery

tsquery是存储用于检索的词条.并且可以联合使用boolean 操作符来连接, & (AND), | (OR), & ! (NOT). 使用括号(),可以强制分为一组.

 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 相同tsquery也有一个to_tsquery函数.

在PG中,以上对文本的预处理可以通过一个函数to_tsvector来完成,函数的返回值是tsvector这个数据类型。
另外,对于待查找的单词,我们也要用to_tsquery这个函数包装起来,函数的返回值是tsquery这个数据类型。
一个简单的例子见下面,to_tsquery里的参数可以使用布尔运算符

SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');?column?
----------t

PostgreSQL全文检索相关推荐

  1. PostgreSQL 全文检索加速 快到没有朋友 - RUM索引接口(潘多拉魔盒)

    PostgreSQL 全文检索加速 快到没有朋友 - RUM索引接口(潘多拉魔盒) 作者 digoal 日期 2016-10-19 标签 PostgreSQL , RUM , GIN , full t ...

  2. Postgresql 全文检索测试

    Postgresql:10.11 测试表数据量:3亿 测试使用8c 16g 服务器 创建一张表: create table nt_order ( id int PRIMARY KEY, order_i ...

  3. 用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询...

    用PostgreSQL 做实时高效 搜索引擎 - 全文检索.模糊查询.正则查询.相似查询.ADHOC查询 作者 digoal 日期 2017-12-05 标签 PostgreSQL , 搜索引擎 , ...

  4. PostgreSQL 实时高效搜索 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询...

    标签 PostgreSQL , 搜索引擎 , GIN , ranking , high light , 全文检索 , 模糊查询 , 正则查询 , 相似查询 , ADHOC查询 背景 字符串搜索是非常常 ...

  5. PostgreSQL何以支持丰富的NoSQL特性?

    一.引言 上篇文章 介绍了PostgreSQL的典型高级SQL特性,PostgreSQL不仅是关系型数据库,同时支持丰富的NoSQL特性,本文将从 <PostgreSQL实战> 一书的&q ...

  6. Oracle业务适合用PostgreSQL去O的一些评判标准

    标签 PostgreSQL , Oracle 背景 Oracle业务适合用PG去O的一些评判标准: 功能指标 如果评估出来的业务中具备这些特性,非常适合使用PostgreSQL. 1.业务使用的数据类 ...

  7. PostgreSQL的json和jsonb比较

    PostgreSQL何以支持丰富的NoSQL特性? 一.引言 PostgreSQL不仅是关系型数据库,同时支持丰富的NoSQL特性 本文主要包含以下三部分内容: PostgreSQL的 JSON和JS ...

  8. PostgreSQL 179个场景

    案例 1.<多字段,任意组合(0建模) - 毫秒级实时圈人 - 最佳实践> 2.<IoT(物联网)极限写入.消费 最佳实践 - 块级(ctid)扫描> 3.数据采样和脱敏实践 ...

  9. PgSQL · 乱入拜年 · 小鸡吉吉和小象Pi吉(PostgreSQL)的鸡年传奇

    背景 我家有只小鸡鸡,它的名字叫吉吉. 吉吉有一位铁杆鸡友大象Pi吉哥哥(PostgreSQL). 吉吉给大伙拜年啦,祝大家鸡年吉祥,新年新气息,与好鸡友大象哥哥愉快的玩耍,鸡情四射. 故事从吉吉和好 ...

  10. 技术流乱入拜年帖 - 小鸡吉吉和小象(PostgreSQL)Pi吉的鸡年传奇

    我家有只小鸡鸡,它的名字叫吉吉. 吉吉有一位铁杆鸡友大象Pi吉哥哥(PostgreSQL). 吉吉给大伙拜年啦,祝大家鸡年吉祥,新年新气息,与好鸡友大象哥哥愉快的玩耍,鸡情四射. 故事从吉吉和好鸡友大 ...

最新文章

  1. ELK日志分析平台搭建全过程
  2. 树莓派出微控制器了!Raspberry Pi Pico 只需 4 美元
  3. python三层装饰器-2020 python学习第十六天————三层装饰器与迭代器
  4. How to consume AIF service(即WCF service) in SSIS project
  5. 吴恩达机器学习笔记:(五)区别于微积分的正规方程求解最优解
  6. 电脑手机wifi互传文件_手机之间怎么互传文件?几则小技巧了解下
  7. Selenium脚本编写技巧和窍门
  8. 微软的基础服务器,微服务器当道 微软云端基础构架揭秘
  9. UVALive - 5857 Captain Q's Treasure
  10. 介绍几款在线脑图和流程图制作工具
  11. MT4单均线变色代码实例
  12. 《“己学”发略》发略
  13. 网页怎么与服务器进行连接,如何实现网页与服务器的连接
  14. 数据分析实战45讲(20)朴素贝叶斯分类(一)
  15. C++年月日时分秒与秒数互相转换
  16. Python综合实战-股票数据分析处理(查询接口)
  17. 什么是内存溢出?在哪些区域会发生内存溢出?
  18. 【JAVA8】新时间API操作大全
  19. LM324系列运放交越失真的解决办法
  20. 安装 Ghost XP 雨林木风纯净版 Y 8.0 系统

热门文章

  1. web kettle 数据采集
  2. 弘辽科技:淘宝评分飘绿四大原因及快速提高评分之解决技巧
  3. C语言pow函数返回值一直是0
  4. yahoo邮箱停止服务器,国内@yahoo.com邮箱用户不能登录的几个解决方案
  5. Mysql8数据库导到Mysql5数据库,报错Unknown collation: 'utf8mb4_0900_ai_ci'
  6. python多变量相关性分析_两个变量与因变量相关性分析_spss多变量相关性分析
  7. 再也不用手写爬虫了!推荐5款自动爬取数据的神器!
  8. 2022-2028年中国罐头行业市场专项调研及发展策略分析报告
  9. YAPI返回值怎么是html页面,Yapi部署
  10. office出现0x4004F00C错误