PostgreSQL 全文搜查简介
在 PostgreSQL 中,全文搜查是一项内置性能,准许您对存储在数据库中的文本口头复杂的搜查。
关于文档、文章或任何方式的基于文本的内容,全文搜查经过对其中的单词和短语建设索引,可以成功高效地搜查。
上方概述了 PostgreSQL 全文搜查的上班原理:
•索引:PostgreSQL 准许您在具备 tsvector 数据类型的列上创立索引。在创立全文搜查的索引时,PostgreSQL 会剖析文本数据,并生成一种叫做tsvector的公用数据结构,该结构驳回了一种针对搜查提升过的格局来示意索引的文档。
•文本剖析:为了构建全文索引,PostgreSQL 会口头文本剖析环节,该环节触及将文本标志化为单个单词或标志,删除停用词(如the,and,...),提取词干(或词形恢复)将单词简化为根方式,并口头其余言语转换以预备索引文本。
•查问:在 PostgreSQL 创立全文索引后,可以经常使用公用的全文搜查函数和操作符,来口头全文搜查查问。例如,您可以搜查特定的单词或短语,运行布尔操作符来组合搜查词等。
•排名:准许您依据搜查结果与查问的相关性,对搜查结果启动排名。PostgreSQL 提供了ts_rank()函数,依据每个文档与搜查查问的相似性,计算其排名分数。您可以经常使用排名性能,依据相关性对搜查结果启动排序。
•突出显示:PostgreSQL 可以对蕴含搜查查问中婚配词的文档,生成片段或摘要。
理想状况下,在内容治理系统(CMS)、文档治理系统等运行程序中,您经常会经常使用全文搜查性能,以便对少量文本启动极速搜查。
PostgreSQL 全文搜查数据类型
PostgreSQL 为全文搜查提供了两种共同的数据类型:tsvector和tsquery:
tsvector是一种数据类型,它准许您驳回一种格局来存储预处置的文档,该格局为高效地搜查和提取文本做了提升。
一个tsvector值是一个排序的列表,列表中的元素蕴含了一个词素(单词),以及它们在文档中的位置和权重。
请留意,词素是没有由后缀发生的变动的单词,例如,watches,watched和watching单词都对应词素watch。
例如,上方语句经常使用了to_tsvector()函数,将单词watches、watched和watching转换为tsvector:
SELECT to_tsvector('watches'),to_tsvector('watched'),to_tsvector('watching');
输入:
to_tsvector | to_tsvector | to_tsvector-------------+-------------+------------- 'watch':1| 'watch':1| 'watch':1(1 row)
在本例中,to_tsvector()函数将单词转换为 tsvector 值。它不是前往原始单词,而是前往这些单词的词素,即watch。
上方的示例,经常使用to_tsvector()函数,将字符串转换为 tsvector 值。例如:
SELECT to_tsvector('The quick brown fox jumps over the lazy dog.');
输入:
to_tsvector------------------------------------------------------- 'brown':3 'dog':9 'fox':4 'jump':5 'lazi':8 'quick':2(1 row)
在此示例中:
• tsvector 值中的每个条目示意了一个单词(词素),及其在字符串(或文档)中的位置。例如,单词quick出如今位置 2,单词brown出如今位置 3,依此类推。
•单词按字母顺序排序。
•文档中的停用词会被省略,如The和over。
在全文搜查中,tsquery是一种用于示意搜查查问的数据类型。它准许您指定蕴含索引文档的单词或短语的搜查条件。
此外,tsquery值可以包括搜查操作符,以细化搜查条件。
•布尔操作符AND (&)、OR (|) 和 NOT (!):可以组合搜查词,并定义它们之间的逻辑相关。
•短语搜查(“”):双引号 (“”) 示意括起来的单词必定按指定的顺序一同出如今索引文档中。
•前缀搜查(:) :单词前面的冒号 (:) 示意搜查词应与具备相反前缀的单词婚配。
•取否(-) :取否操作,用于扫除婚配特定搜查词的搜查结果。
•分组() :您可以经常使用括号对术语和操作符启动分组,以定义灵敏的搜查条件。
例如:
'quick' & 'brown' | 'fox'
该tsquery会搜查同时蕴含单词 “quick” 和 “brown”(以恣意顺序)或单词 “fox” 的文档。
to_tsquery()将字符串转换为一个tsquery。例如,上方语句经常使用to_tsquery(),将单词 “jumping” 转换为一个tsquery:
SELECT to_tsquery('jumping');
输入:
to_tsquery------------ 'jump'(1 row)
婚配操作符(@@)
婚配操作符(@@)会评价文档中的文本(tsvector)与搜查查问中指定的搜查词(tsquery)之间的相似性,假设婚配,则前往 true,否则前往 false。
tsvector @@ tsquery
例如,上方语句经常使用@@操作符,来确定字符串能否与tsquery婚配:
SELECTto_tsvector('The quick brown fox jumps over the lazy dog.') @@ to_tsquery('jumping') result;
输入:
result-------- t(1 row)
它前往了 true,由于 tsvector 中蕴含了单词 jump,它是单词 jumping 的词素。
上方的示例经常使用婚配运算符(@@),来确定字符串能否蕴含单词 cat:
SELECTto_tsvector('The quick brown fox jumps over the lazy dog.') @@ to_tsquery('cat') result;
输入:
result-------- f(1 row)
在表数据上经常使用 PostgreSQL 全文搜查索引
让咱们来看一些经常使用布尔操作符启动全文搜查的示例。
1) 设置示例表
首先,创立一个新表,名为posts:
CREATE TABLE posts(id SERIAL PRIMARY KEY,title TEXT NOT NULL,body TEXT,body_search TSVECTORGENERATED ALWAYS AS (to_tsvector(body)) STORED);
在posts表中,body_search是一个数据类型为tsvector的生成列。
当你在更改body列中的数据时,PostgreSQL 会经常使用to_tsvector()函数将其转换为tsvector,并将其存储在body_search列中。
第二步,在posts表中拔出一些行:
INSERT INTO posts (title, body)VALUES('Introduction to PostgreSQL', 'This is an introductory post about PostgreSQL. It covers basic concepts and features.'),('Advanced PostgresSQL Techniques', 'In this post, we delve into advanced PostgreSQL techniques for efficient querying and>